2013-12-16 6 views
0

데이터베이스 다이어그램이 있고 다른 테이블로 데이터베이스를 만들어야합니다. SQL : 하나의 기본 키를 참조하는 2 개의 외래 키

enter image description here

내 코드입니다 :

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; 

그러나 'rabatt'작성에 오류가있다, 그것은 마지막 명령이 무효라고 말한다.

외래 키 (fnrvon, fnran) 참조 FIRMA

이 어떻게 든 잘못,하지만 난 이유를 알고하지 않습니다 ...이 그림은 잘못인가? 'liefert'에서 'firma'로가는 두 개의 키가 있습니다. 어떻게해야합니까? 제발 도와주세요!

감사합니다. (Microsoft SQL Server 2008을 사용 중입니다.)

답변

4

다른 테이블을 참조 할 때 참조 할 열을 지정해야합니다. 그래서, 예를 들어 :

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

감사합니다. 매우 고쳐 주셔서 감사합니다. 저는 SQL 초보자이기 때문에 많은 도움을 받았습니다! (나는 6 분 안에 답을 수락 할 것이다!) – moritzg

1

Mureinik 잘, 그냥 내 앞에 1 초 대답했다. 질문을 위해서 나는 바이올린이 너무

foreign key (fnrvon, fnran) references firma 

알아낼 실패 귀하의 FIRMA 테이블에 열을 이름 fnrvon이 있거나 fnran없는 추가 질문

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

+0

고마워! sqlfiddle이 있다는 것을 몰랐습니다! – moritzg

0

그것을 개선 상자에 포장 무엇 참조됩니다.

명시해야합니다. 또한 두 개의 열이 모두 동일한 외래 키를 참조하는 경우 두 개의 별도 문이어야합니다.

foreign key (fnran) references firma (fnr) 
foreign key (fnrvon) references firma (fnr) 
관련 문제