简体   繁体   English

SQL:2个外键引用一个主键

[英]SQL: 2 Foreign Keys referencing one Primary Key

I have a database diagram and need to create a Database with different tables. 我有一个数据库图,需要创建一个具有不同表的数据库。

在此处输入图片说明

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. 但是'rabatt'创建中存在错误,它表示最后一个命令无效。

foreign key (fnrvon, fnran) references firma 外键(fnrvon,fnran)引用固件

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? 从“ liefert”到“ firma”还有两个键,我该怎么做? Please help me! 请帮我!

Thanks! 谢谢! (I'm using Microsoft SQL Server 2008) (我正在使用Microsoft SQL Server 2008)

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)
);

Mureinik is right, just answered 1 sec before me. Mureinik是正确的,在我面前回答了1秒。 For the sake of the question I crated a Fiddle Improve it for further questions 为了这个问题,我选择了一个小提琴改进它以解决其他问题

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

Your firma table doesn't have columns named fnrvon or fnran so 您的firma表没有名为fnrvon或fnran的列,因此

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM