Jag skulle gissa att TS har för avsikt att använda tabellen Name med unika namn men att tabellen Person kan gha flera likadana referenser till namn i Namn-trabelen, det kan ju finnas en Nisse som är 23 år och en som är 35 exempelvis.
Tabellen person behöver troligen byggas ut så att man separerar för och efternamn samt att man byter age mot BirthYear samt att man har ytterligare kolumner för at särskilja de olika personerna. Men en början är att ha en Stored Procedure som ser ut så här:
Jag har också ändrat namnet på aelanders SP så namnet återspeglar vad man egentligen vill göra med SPn, dvs lägga till en person med namn och ålder. Men att namnets klartext endast ska sparas en gång för att bland annat spara utrymme.
Om du lägger in både förnamn och efternamn i kolumnen namn så kommer utrymmesbesparingen att vara obetydlig jämfört om du delar upp förnamn och efternamn i varsin kolumn.
Just i detta fall passar det inte att använda en TRIGGER.
Kod:
-- Följande tabelldefintioner har jag använt:
delimiter $$
CREATE TABLE `name`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name_UNIQUE` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=57 DEFAULT CHARSET=latin1$$
delimiter $$
CREATE TABLE `person`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` int(11) NOT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1$$
Kod:
DELIMITER //
//
DROP PROCEDURE IF EXISTS addPerson;
//
delimiter //
create procedure addPerson(Namn tinytext, age int(11))
begin
declare chk int default 0;
select count(*) from Name where Name = Namn into chk;
if chk = 0 then
insert into Name (Name) values (Namn);
insert into Person (Name, age) values (last_insert_id(), age);
else
-- Om tanken med proceduren är att man ska kunna lägga till alla personer i
-- Persontabellen oavsett om namnet finns sedan tidigare men inga dubbletter
-- i name-tabellen så ska även denna insert-sats med, kanske bör fler villkor
-- byggas till för att det ska bli en vettig funktionalitet.
insert into Person (Name, age) values ((select id from name where name=Namn), age);
end if;
end
//
delimiter ;
Kod:
-- Uppläggning av testdata
CALL addPerson('Nisse', 23);
CALL addPerson('Anders', 34);
CALL addPerson('Barak', 36);
CALL addPerson('Nisse', 33);
CALL addPerson('Anders', 44);
CALL addPerson('Barak', 46);
CALL addPerson('Nisse', 43);
CALL addPerson('Anders', 54);
CALL addPerson('Barak', 56);
Kod:
-- Visa innehållet i tabellerna efter att man kört SPn
-- Endast 3 förekomster/tupler i Name-tabellen
select * from Name order by name;
-- Men hela 9 förekomster/tupler i Persontabellen
SELECT p.id, n.name, p.age
FROM Person p, name n
WHERE p.name=n.id
ORDER BY name;
Kod:
-- Här även en View så man enkelt kan presetera värden från Persontabellen genom att skriva:
-- SELECT * FROM Person_view
-- ...i stället för en krånglig SQL-sats...
delimiter //
CREATE VIEW `person_view` AS
select `p`.`id` AS `id`,`n`.`name` AS `name`,`p`.`age` AS `age`
from (`person` `p` join `name` `n`)
where (`p`.`name` = `n`.`id`)
order by `n`.`name`
//