moritzg
moritzg

Reputation: 4396

SQL: 2 Foreign Keys referencing one Primary Key

I have a database diagram and need to create a Database with different tables.

enter image description here

This is my code:

use FirmaLieferungen;

drop table liefert;
drop table rabatt;
drop table artikel;
drop table firma;

SET DATEFORMAT dmy;

create table firma (
   fnr            integer primary key,
   name           char(10),
   jahrgruendung  integer, -- Gründungsjahr
   land           char(3)
);

insert into firma     values (101,'Schwer'    ,1890,'A'  );
insert into firma     values (102,'Schmal'    ,1901,'CH' );
insert into firma     values (103,'Tief'      ,1945,'I'  );
insert into firma     values (104,'Breit'     ,1950,'A'  );
insert into firma     values (105,'Leicht'    ,1945,'F'  );
insert into firma     values (106,'Hoch'      ,1920,'CH' );
insert into firma     values (107,'Hell'      ,1900,'A'  );

create table artikel (
   fnr            integer,
   lfdnr          integer,
   bezeichnung    char(10),
   preis          decimal(6,2),
   einheit        char(3),
   land           char(3),
   primary key(fnr, lfdnr),
   foreign key(fnr) references firma
);

insert into artikel   values (101,1,'Schaufel'  ,12.30,'Stk','A'  );
insert into artikel   values (101,2,'Hacke'     ,15.20,'Stk','F'  );
insert into artikel   values (102,1,'Spaten'    ,13.00,'Stk','A'  );
insert into artikel   values (103,1,'Schere'    , 8.00,'Stk','A'  );
insert into artikel   values (103,2,'Messer'    ,10.60,'Stk','F'  );
insert into artikel   values (103,3,'Schnur'    , 1.10,'m'  ,'D'  );
insert into artikel   values (105,1,'Schnur'    , 0.40,'m'  ,'D'  );
insert into artikel   values (106,1,'Hacke'     ,20.70,'Stk','CH' );
insert into artikel   values (106,2,'Draht'     , 0.60,'m'  ,'CH' );

create table liefert (
   fnrvon         integer,
   fnran          integer,
   fnr            integer,
   lfdnr          integer,
   datum          date,
   menge          decimal(8,2)
   primary key(fnrvon, fnran, fnr, lfdnr, datum),
   foreign key(fnr, lfdnr) references artikel,
   foreign key(fnr) references firma
);

insert into liefert values (101,102,101,1,'01.02.1999',    3.00);
insert into liefert values (101,102,101,1,'02.01.2000',    2.00);
insert into liefert values (101,104,101,2,'13.02.2000',   11.00);
insert into liefert values (101,104,101,1,'24.11.1999',   19.00);
insert into liefert values (101,105,103,3,'31.03.2001', 1553.00);
insert into liefert values (102,101,102,1,'21.04.1999',   28.00);
insert into liefert values (102,101,101,1,'11.12.1999',    1.00);
insert into liefert values (102,104,101,1,'04.07.2000',   63.00);
insert into liefert values (103,101,103,3,'21.04.1999',    3.25);
insert into liefert values (103,104,101,1,'08.02.1998',   17.00);
insert into liefert values (104,102,105,1,'19.11.2001',  132.50);
insert into liefert values (104,106,101,1,'04.07.2000',   22.00);
insert into liefert values (106,102,101,1,'07.08.2002',   81.00);
insert into liefert values (106,102,106,2,'01.06.2002',   21.30);
insert into liefert values (106,104,101,1,'26.09.2001',    2.00);

create table rabatt (
   fnrvon         integer,
   fnran          integer,
   prozent        decimal (5,2),
   primary key (fnrvon, fnran),
   foreign key (fnrvon, fnran) references firma
);

insert into rabatt    values (101,102, 5.25);
insert into rabatt    values (102,101, 5.50);
insert into rabatt    values (101,103,15.75);
insert into rabatt    values (103,102, 7.50);
insert into rabatt    values (102,103,10.50);
insert into rabatt    values (105,106, 5.25);
insert into rabatt    values (104,101, 7.50);



select * from rabatt;
select * from firma;
select * from liefert;
select * from artikel;

But there's an error in the 'rabatt' creation, it says that the last command is invalid.

foreign key (fnrvon, fnran) references firma

This is somehow wrong, but I don't know why... Is the diagram wrong? There are also two keys going from 'liefert' to 'firma' how do I do this? Please help me!

Thanks! (I'm using Microsoft SQL Server 2008)

Upvotes: 0

Views: 1502

Answers (3)

David Garrison
David Garrison

Reputation: 2880

Your firma table doesn't have columns named fnrvon or fnran so

foreign key (fnrvon, fnran) references firma

fails to figure out what is referenced.

You need to be explicit. Also, If the two columns are both referencing the same foreign key, then it needs to be two separate statements

foreign key (fnran) references firma (fnr)
foreign key (fnrvon) references firma (fnr)

Upvotes: 0

jean
jean

Reputation: 4350

Mureinik is right, just answered 1 sec before me. For the sake of the question I crated a Fiddle Improve it for further questions

http://sqlfiddle.com/#!6/6a1b7

Upvotes: 1

Mureinik
Mureinik

Reputation: 311326

When you reference another table, you should specify which column(s) you are referencing. So, for example:

create table liefert (
   fnrvon         integer,
   fnran          integer,
   fnr            integer,
   lfdnr          integer,
   datum          date,
   menge          decimal(8,2)
   primary key(fnrvon, fnran, fnr, lfdnr, datum),
   foreign key(fnr, lfdnr) references artikel (fnr, lfdnr),
   foreign key(fnr) references firma (fnr)
);

Upvotes: 4

Related Questions