同时使用外键和主键

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

【讨论】:

我更新了问题中的代码,请再看一遍

以上是关于同时使用外键和主键的主要内容,如果未能解决你的问题,请参考以下文章

主键、外键和索引的区别?

请问SQL server 中的主键和外键的作用

3.啥是键、候选键、主键和外键?

主键外键和子查询

主键外键和索引的区别?

主键外键和索引的区别?