28. juni 2005 - 16:15
Der er
9 kommentarer og 1 løsning
Ingen primary key?
Når man laver en tabel kan man så komme ud for at det ikke er muligt at definere en primary key? Jeg har lavet denne tabel: create table teaching ( ProfId int, CrsCode varchar(10), Semester varchar(10), primary key(CrsCode, Semester) ) engine=InnoDB; Og indsat følgende værdier: insert into teaching values (1,'MGT123', 'F1994'); insert into teaching values (3,'EE101', 'S1991'); insert into teaching values (5,'CS305', 'F1995'); insert into teaching values (6,'MGT123', 'F1994'); insert into teaching values (2,'CS315', 'S1997'); insert into teaching values (4,'MAT123', 'S1996'); insert into teaching values (3,'EE101', 'F1995'); insert into teaching values (2,'CS305', 'S1996'); insert into teaching values (4,'MAT123', 'F1997'); insert into teaching values (7,'MGT123', 'F1997'); insert into teaching values (1,'MGT123', 'F1997'); Men med den ovenstående Primary key giver det jo problemer med de sidste 3 værdier jeg indsætter idet der findes 3 tupler om opfylder primary key. Bør man helt undlade at definere en primary key for denne tabel?
Annonceindlæg tema
Du kan ikke indsætte hvis primary key er et duplikat I dette tilfælde er primary key jo ikke duplikat - der indgår 2 felter i primary begge - værdierne i begge disse har individuelt duplikater - men kombineret har de ingen duplikater så alt er vel fint !?
arne_v - de to nederst tupler er da helt ens på både CrsCode og Semester. Som jeg ser det er du nødt til at lave alle tre felter til en primary key. Man kan så sige, at det er overføldigt, men jeg bestemt det er en fordel. -- Morten Barklund
Jeg får denne her fejl: ERROR 1062 (23000): Duplicate entry 'MGT123-F1994' for key 1 ERROR 1062 (23000): Duplicate entry 'MGT123-F1997' for key 1
sorry - ja de er ens hvad med at smække en autoincrement id på tabellen og bruge den ? (primary keys med 3 felter er muligt men besværlige at arbejde med)
Nu har jeg et andet problem. Af en eller anden grund så giver det den fejl når jeg forsøge at lave en foreign key: create table teaching ( ProfId int, CrsCode varchar(10), Semester varchar(10), primary key(ProfId, CrsCode, Semester) ) engine=InnoDB; create table transcript ( StudId int, CrsCode varchar(10), Semester varchar(10), primary key(StudId, CrsCode, Semester), foreign key(CrsCode, Semester) references teaching(CrsCode, Semester) ) engine=InnoDB; Dette giver fejlen: ERROR 1005 (HY000): Can't create table '.\haps\transcript.frm' (errno: 150)
Du har jo ikke en key på den anden tabel på præcis de to felter - men du kan godt lave et index på de to - det er bare ikke garanteret unikt. Derudover virker det nu også lidt rodet - prøv at starte med at lave et databasediagram i stedet for, så kommer SQL til sidst og er intet problem. Tegn dig et E/R diagram først, så kan du bedre se, hvordan tabellerne hænger sammen og hvor der skal være private og foreign keys.
Det giver stadig den samme fejl selvom jeg skriver: create table transcript ( StudId int, CrsCode varchar(10), Semester varchar(10), primary key(StudId, CrsCode, Semester), foreign key(CrsCode, Semester) references teaching(ProfId, CrsCode, Semester) ) engine=InnoDB; Nu refererer min foreign key til en tilsvarende key i teaching.
foreign key(CrsCode, Semester) references teaching(ProfId, CrsCode, Semester) er med garanbti forkert (2 felter kan aldrig matche 3 felter !!)
Man laver altså heller ikke databasedesign ved at starte med at få sql'en til at virke. :/
07. juli 2005 - 11:39
#10
Men man skal jo starte et sted.
Computerworld tilbyder specialiserede kurser i database-management