Sql ORA-02256:引用列数必须与引用列数匹配

Sql ORA-02256:引用列数必须与引用列数匹配,sql,oracle,Sql,Oracle,我得到一个错误 分配很弱,不确定如何修复任何帮助都很好:D CREATE TABLE STATEMENTS. OK. 0 rows OK. 0 rows FOREIGN KEY (ProdId) REFERENCES ALLOCATION * Error at line 7: ORA-02256: number of referencing columns must match referenced columns Prod

我得到一个错误

分配很弱,不确定如何修复任何帮助都很好:D

CREATE TABLE STATEMENTS.

OK. 0 rows

OK. 0 rows

FOREIGN KEY (ProdId) REFERENCES ALLOCATION
                                *
Error at line 7:
ORA-02256: number of referencing columns must match referenced columns

ProdID是一列,但引用表中的主键是两列,即MgrID和ProdID。不能让FK引用PK的子集


如何修复取决于您想做什么。例如,为什么需要ProdID来引用分配而不是PRODUCT(顺便说一句,您没有显示的表)?

如果您没有引用主键本身,那么还需要提到引用表的列

CREATE TABLE MANAGER (
MgrId number (3),
MFirstName varchar2(30),
MSurName varchar2(30),
PRIMARY KEY (MgrId)
);

CREATE TABLE ALLOCATION (
MgrId number (3),
ProdId number(4),
PRIMARY KEY (MgrId, ProdId),
FOREIGN KEY (MgrId) REFERENCES MANAGER,
FOREIGN KEY (ProdId) REFERENCES PRODUCT
);

CREATE TABLE QUALITYCHECK (
WeekNo number (1),
Score number (1),
MgrId number (3) NOT NULL,
ProdId number(4) NOT NULL,
PRIMARY KEY (WeekNo, MgrId, ProdId),
FOREIGN KEY (MgrId) REFERENCES ALLOCATION,
FOREIGN KEY (ProdId) REFERENCES ALLOCATION
);
并始终引用父表。虽然不是强制性的。这只是一个需要遵循的标准

CREATE TABLE ALLOCATION (
  MgrId number (3),
  ProdId number(4),
  PRIMARY KEY (MgrId, ProdId),
  FOREIGN KEY (ProdId) REFERENCES PRODUCT(ProdId),
  FOREIGN KEY (MgrId) REFERENCES MANAGER(MgrId)
);

这是建议的,但在Oracle中不是必需的,并且与OP收到的错误消息无关。对于新手来说,这不是一个失分,但对于像你这样有经验的董事会参与者来说,这是一个明确的失分。恭喜你投了赞成票!而且,正如我所看到的,“正确答案”也是如此@马修,这是标准的。无论如何,谢谢你的评论。添加了很多信息。我不知道“标准的很多”是什么意思;在Oracle标准中,指示列名是可选的。它不会引起错误。OP的帖子在分配表中显示了一个错误作为参考表,而您的答案是关于另一个表。你可以说“谢谢我”,也可以简单地删除你的答案——你的选择。再次祝贺你获得了这些荣誉!
CREATE TABLE QUALITYCHECK (
  WeekNo number (1),
  Score number (1),
  MgrId number (3) NOT NULL,
  ProdId number(4) NOT NULL,
  PRIMARY KEY (WeekNo, MgrId, ProdId),
  FOREIGN KEY (MgrId) REFERENCES MANAGER(MgrId),
  FOREIGN KEY (ProdId) REFERENCES PRODUCT(ProdId)
);