主键和外键

时间:2018-12-10 21:10:19

标签: sql oracle

嗨,我的参考文献有问题

ALTER TABLE POZYCJA_FAKTURY
ADD (CONSTRAINT FK_ASD FOREIGN KEY (ID_Pozycji)
references FAKTURA (ID_Pozycji))
Error report -
ORA-02270: niezgodność klucza unikatowego lub głównego dla tej listy kolumn
02270. 00000 -  "no matching unique or primary key for this column-list"
*Cause:    A REFERENCES clause in a CREATE/ALTER TABLE statement
           gives a column-list for which there is no matching unique or primary
           key constraint in the referenced table.
*Action:   Find the correct column names using the ALL_CONS_COLUMNS
           catalog view

create table FAKTURA
(
ID_Faktury  number(9)   not null,
ID_Naprawy  number(9)   not null,
ID_Pozycji  number(9)   not null,
ID_Osoby_Pracownik  number(9)   not null,
ID_Osoby_Klient number(9) not null,
NR_Faktury  number(9)   not null,
Data_Faktury    date    not null,

constraint PK_FAKTURA primary key (ID_Faktury)

);

create table POZYCJA_FAKTURY
(
ID_Pozycji number(9) not null,
Ilosc   number(10)  not null,

constraint PK_POZYCJA_FAKTURY primary key (ID_Pozycji)

);


ALTER TABLE POZYCJA_FAKTURY
ADD CONSTRAINT FK_FAKTURA_POZYCJA_FAKTURY FOREIGN KEY (ID_Pozycji)
REFERENCES FAKTURA (ID_Pozycji);

你知道什么地方出了问题吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

您正试图添加一个外键,该外键指向ID_Pozycji表上的FAKTURA列:

FOREIGN KEY (ID_Pozycji) references FAKTURA (ID_Pozycji)

但这不是该表上的键,ID_Faktury是:

constraint PK_FAKTURA primary key (ID_Faktury)

外键必须指向目标表上的键。例如:

FOREIGN KEY (ID_Faktury) references FAKTURA (ID_Faktury)

这就是识别目标表中记录的方式。 ID_Faktury列标识了FAKTURA记录,因此任何需要外键返回到FAKTURA的表都需要在该表上引用ID_Faktury。 (尽管外键列本身不需要使用相同的名称,但是通常最好是避免混淆。)


相反, 可能至少可以引用唯一列(如果不是主键)。我不是Oracle专家,但是此消息至少暗示了以下内容:

  

CREATE / ALTER TABLE语句中的REFERENCES子句提供了一个列列表,该列列表在引用表中没有匹配的唯一主键约束

>

尽管从数据建模的角度来看,我仍然建议使用主键作为参考点,但您的RDBMS可能仅支持将外键添加到唯一字段中。但首先,FAKTURA表上的该字段必须唯一:

CONSTRAINT U_ID_Pozycji UNIQUE (ID_Pozycji)