Oracle SQL:为什么不能从单独的表中的每个外键引用一个主键?

时间:2014-04-16 01:29:44

标签: sql database oracle

create table Product(
      Prodid number(5) primary key
    , Prodesc varchar(20)
    , Price number(6,2)
    , Stock number (6)
);

这个外键是指产品表的产品:

create table Purchase(
      Purid number(9) primary key
    , Proid number(5)
    , CONSTRAINT fk_Product FOREIGN KEY(Proid) REFERENCES Product(Prodid)
    , qty number(6)
    , supname char(15)
);

这个外键也指产品表的产品:

create table Sales(
      Saleid number(9) primary key
    , Proid number(5)
    , CONSTRAINT fk_Product FOREIGN KEY(Proid) REFERENCES Product(Proid)
    , qty number(6)
    , custname char(15)
);

但是我收到了一个错误。 “已经被约束使用的名称。” 。解决这个问题的任何解决方案?我希望这两个表(Purchase& Sales)的外键引用到Product表的相同主键。

1 个答案:

答案 0 :(得分:2)

问题正如@OldProgrammer和其他人所建议的那样,你在两种情况下都试图使用相同的约束名。您需要使用不同的约束名称。您可能希望为您的密钥使用某种命名约定 - 我更喜欢在名称中同时使用父级和子级的命名约定。所以我做了像

这样的事情
create table Purchase(
      Purid number(9) primary key
    , Proid number(5)
    , CONSTRAINT fk_purchase_product FOREIGN KEY(Proid) REFERENCES Product(Prodid)
    , qty number(6)
    , supname char(15)
);

create table Sales(
      Saleid number(9) primary key
    , Proid number(5)
    , CONSTRAINT fk_sales_product FOREIGN KEY(Proid) REFERENCES Product(Proid)
    , qty number(6)
    , custname char(15)
);

与您的错误无关,但我非常怀疑任何列都应该声明为char(15)varchar2(15)几乎肯定更有意义 - 您不太可能希望将名称空间填充到15个字节,或者您希望在代码中使用char比较语义。