同时使用外键和主键
Posted
技术标签:
【中文标题】同时使用外键和主键【英文标题】:Foreign Keys and Primary Keys at the same time 【发布时间】:2010-12-26 20:32:44 【问题描述】:我正在尝试创建表(orderdetails2);该表在两个 FK 列上有两个 FK 和一个 PK。这是我的代码:
版本 1
create table OrderDetails2 (
PFOrder_ID Number(3) FOREIGN KEY REFERENCES Orderr(Order_ID),
PFProduct_ID Number(3) FOREIGN KEY REFERENCES Product(Product_ID),
CONSTRAINT PF PRIMARY KEY (PFOrder_ID,PFProduct_ID),
CONSTRAINT FK_1 FOREIGN KEY (PFProudct_ID)
REFERENCES Product(Product_ID),
CONSTRAINT FK_2 FOREIGN KEY (PFOrder_ID)
REFERENCES Orderr(Order_ID),
版本 2
create table OrderDetails2 (
PFOrder_ID Number(3)
PFProduct_ID Number(3)
CONSTRAINT PF PRIMARY KEY (PFOrder_ID,PFProduct_ID),
CONSTRAINT FK_1 FOREIGN KEY (PFProudct_ID) REFERENCES Product(Product_ID),
CONSTRAINT FK_2 FOREIGN KEY (PFOrder_ID) REFERENCES Orderr(Order_ID)
);
我正在使用 Oracle Express。运行代码时会出现问题。这是(对于版本 1):
ORA-00907: missing right parenthesis
有什么问题?
【问题讨论】:
我更新了代码,请再看一遍 请更新弹出的问题。 【参考方案1】:从代码的变体开始:
create table OrderDetails2 (
PFOrder_ID Number(3)
PFProduct_ID Number(3)
CONSTRAINT PF PRIMARY KEY (PFOrder_ID,PFProduct_ID),
CONSTRAINT FK_1 FOREIGN KEY (PFProudct_ID) REFERENCES Product(Product_ID),
CONSTRAINT FK_2 FOREIGN KEY (PFOrder_ID) REFERENCES Orderr(Order_ID)
);
PFOrder_ID NUMBER(3)
和PFPoduct_ID NUMBER(3)
之后缺少逗号。
CREATE TABLE OrderDetails2
(
PFOrder_ID NUMBER(3),
PFProduct_ID NUMBER(3),
CONSTRAINT PF PRIMARY KEY (PFOrder_ID, PFProduct_ID),
CONSTRAINT FK_1 FOREIGN KEY (PFProduct_ID) REFERENCES Product(Product_ID),
CONSTRAINT FK_2 FOREIGN KEY (PFOrder_ID) REFERENCES Orderr(Order_ID)
);
PRIMARY KEY 子句必须与 PFProduct_ID 列分开,因为它是一个复合键。 (Orderr
拼写是否正确?)而原文中的PFProudct_ID
不正确。如果您是程序员,则必须能够一致地拼写(即使在更广泛的写作意义上不正确)。
【讨论】:
另外,作为一般性评论(我可能会提到答案),名称“PK”、“FK_1”和“FK_2”太笼统了;使用“PF_OrderDetails2”、“FK_1_OrderDetails2”和“FK_2_OrderDetails2”可能会更好。 一致性比正确性更有用的另一种情况。处理约束、索引、触发器等的命名约定并坚持下去。【参考方案2】:将最后一个逗号更改为右括号:)
。
CREATE TABLE OrderDetails2
(
...,
CONSTRAINT FK_2 FOREIGN KEY (PFOrder_ID) REFERENCES Orderr(Order_ID)
)
【讨论】:
我更新了问题中的代码,请再看一遍以上是关于同时使用外键和主键的主要内容,如果未能解决你的问题,请参考以下文章