Avatar billede bolmer Nybegynder
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?
Avatar billede arne_v Ekspert
28. juni 2005 - 16:21 #1
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 !?
Avatar billede barklund Nybegynder
28. juni 2005 - 16:31 #2
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
Avatar billede bolmer Nybegynder
28. juni 2005 - 16:32 #3
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
Avatar billede arne_v Ekspert
28. juni 2005 - 16:39 #4
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)
Avatar billede bolmer Nybegynder
28. juni 2005 - 16:43 #5
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)
Avatar billede barklund Nybegynder
28. juni 2005 - 16:49 #6
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.
Avatar billede bolmer Nybegynder
28. juni 2005 - 16:52 #7
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.
Avatar billede arne_v Ekspert
28. juni 2005 - 17:05 #8
foreign key(CrsCode, Semester) references teaching(ProfId, CrsCode, Semester)

er med garanbti forkert (2 felter kan aldrig matche 3 felter !!)
Avatar billede barklund Nybegynder
28. juni 2005 - 17:08 #9
Man laver altså heller ikke databasedesign ved at starte med at få sql'en til at virke. :/
Avatar billede bolmer Nybegynder
07. juli 2005 - 11:39 #10
Men man skal jo starte et sted.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester