Vinnaren i pepparkakshustävlingen!
2016-04-11, 22:49
  #1
Medlem
KruxaNs avatar
Det är så att jag har börjat lära mig SQL och försöker ta mig an uppgifter på nätet men jag fastnat lite vid en specifik del av foreign keys i min kod.

Kod:
drop database nick;
create database nick;
use nick;

create table person(
pnr char(13),
namn varchar(20),
primary key(pnr)
)engine=innodb;

create table tävling(
namn varchar(20),
datum datetime,
primary key(namn)
)engine=innodb;

create table domare(
pnr char(13),
namn varchar(20),
lon int,
primary key (pnr)
)engine=innodb;

create table domer(
namn varchar(20),
pnr char(13),
primary key (namn, pnr),
foreign key (pnr) references domare(pnr),
foreign key (namn) references tävling(namn)
)engine=innodb;

create table spelare(
pnr char(13),
namn varchar(20),
primary key (pnr)
)engine=innodb;

create table boll(
signatur varchar(20),
marke char(20),
nr int(11),
pnr char(13),
primary key (signatur),
foreign key (pnr) references spelare(pnr)
)engine=innodb;

create table caddy(
pnr char(13),
namn varchar(20),
favorittips varchar(20),
primary key (pnr)
)engine=innodb;

create table golfbag(
marke varchar(20),
typ varchar(20),
pnr char(13),
caddypnr char(13),
primary key (pnr, marke),
foreign key (pnr) references spelare(pnr),
foreign key (caddypnr) references caddy(pnr)
)engine=innodb;

create table klubba(
pnr char(13),
marke varchar(20),
namn varchar(20),
kommentar varchar(20),
primary key (pnr, marke, namn),
foreign key (pnr) references spelare(pnr),
foreign key (marke) references golfbag(marke)
)engine=innodb;

create table speltillfalle(
starttid datetime,
reslutat varchar(20),
namn varchar(20),
pnr char(13),
primary key (starttid, namn, pnr),
foreign key (namn) references tävling(namn),
foreign key (pnr) references spelare(pnr)
)engine=innodb;

insert into tävling(namn, datum) values ('Sigges sommargolf', '2016-07-10');

insert into domare(pnr, namn, lon) values ('790129-4444', 'Simon', '12000');
insert into domare(pnr, namn, lon) values ('810912-5555', 'Sven', '12000');
insert into domare(pnr, namn, lon) values ('790612-1212', 'Eva', '12000');
insert into domare(pnr, namn, lon) values ('560201-1111', 'Jens', '12000');
insert into domare(pnr, namn, lon) values ('770202-3333', 'Karl', '12000');

insert into domer(namn, pnr) values ('Sigges sommargolf', '790129-4444');
insert into domer(namn, pnr) values ('Sigges sommargolf', '810912-5555');
insert into domer(namn, pnr) values ('Sigges sommargolf', '790612-1212');
insert into domer(namn, pnr) values ('Sigges sommargolf', '770202-3333');

insert into spelare(pnr, namn) values ('560123-6666', 'Bosse');
insert into spelare(pnr, namn) values ('790909-1111', 'Max');
insert into spelare(pnr, namn) values ('670808-2222', 'Sune');
insert into spelare(pnr, namn) values ('790101-4343', 'Benny');
insert into spelare(pnr, namn) values ('900820-1111', 'Stina');

insert into golfbag(marke, typ, pnr, caddypnr) values ('730303-1111', 'Nike', 'Tour', '560808-1111');

insert into klubba(pnr, marke, namn, kommentar) values ('730303-1111', 'Nike', 'Driver', 'Spikrak och kort');
insert into klubba(pnr, marke, namn, kommentar) values ('560808-1111', 'Nike', 'Driver', 'Längst och snedast på touren');
insert into klubba(pnr, marke, namn, kommentar) values ('900820-1111', 'Nike', 'Driver', 'Säkra bettan');

insert into caddy(pnr, namn, favorittips) values ('568602-1111', 'Anna', 'Knyt skorna hårdare');
insert into caddy(pnr, namn, favorittips) values ('560808-1111', 'Petra', 'Svinga lugnt');

insert into speltillfalle(starttid, resultat, namn, pnr) values ('2016-07-10 10:25:00', null, 'Sigges sommargolf', '560123-6666');
insert into speltillfalle(starttid, resultat, namn, pnr) values ('2016-07-10 13:10:00', 72, 'Sigges sommargolf', '670808-2222');
insert into speltillfalle(starttid, resultat, namn, pnr) values ('2016-07-10 12:05:00', 'Diskad', 'Sigges sommargolf', '900820-1111');
insert into speltillfalle(starttid, resultat, namn, pnr) values (null, 'Diskad', 'Sigges sommargolf', '790101-4343', null);

insert into boll(signatur, marke, nr, pnr) values ('Hjärta', 'Titelist', null, '670808-2222');
insert into boll(signatur, marke, nr, pnr) values ('Tre prickar', null, null, '770202-3333');

Jag får "Cannot add foreign key constraint" hela tiden vid "create table klubba".

Jag fick liknande problem tidigare vid en tabell som jag fixade snabbt men hur jag en vrider och vänder på det hela återuppstår samma felmeddelande hela tiden. Vad har jag missat?

Jag vet att jag kanske har några småfel längre ner men jag har inte korrigerat dessa än.
Citera
2016-05-25, 19:53
  #2
Medlem
Bortamatchens avatar
Plocka bort ett av dina constraints så ser du vilken av dem som är problemet.
Citera
2016-05-30, 00:04
  #3
Medlem
Problemet är nog att du har en foreign key som inte går mot en primary key. Om du vill ha en foreign key som inte går mot en primary key måste den iaf ha ett index, annars blir det svårt.

Men dina primärnyckar är ju kompositnycklar.

T.ex: i Klubbar har du en foreign key:

foreign key (marke) references golfbag(marke)

men primary key i golfbag är ju:
primary key (pnr, marke)

Du har inget index på enbart märke, det finns då inget sätt för DB att mappa upp unika rader.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback