【问题标题】:Add constraints for a foreign key that references multipleprimary keys from different tables in SQL Plus?为引用 SQL Plus 中不同表的多个主键的外键添加约束?
【发布时间】:2020-11-06 05:45:32
【问题描述】:

我是一名学习 SQL 的初学者,在实施这个概念时遇到了困难。

假设你创建了以下三个表:

CREATE TABLE dogOwner(
 ownerNo VARCHAR(8) CONSTRAINT ownerNo_pk1 PRIMARY KEY,
 ownerName VARCHAR(10)
);

CREATE TABLE catOwner(
 ownerNo VARCHAR(8) CONSTRAINT ownerNo_pk2 PRIMARY KEY,
 ownerName VARCHAR(10)
);

CREATE TABLE petsAdopted(
 petNo VARCHAR(8) CONSTRAINT petNo_pk PRIMARY KEY,
 ownerNo VARCHAR(8) CONSTRAINT ownerNo_fk1 REFERENCES dogOwner(ownerNo)
                    CONSTRAINT ownerNo_fk2 REFERENCES catOwner(ownerNo)
);

您如何正确地为外键 ownerNo 创建约束,该外键从其他两个表中引用 ownerNo?

【问题讨论】:

    标签: sql oracle foreign-keys ddl


    【解决方案1】:

    你不能。您可以在 petsAdopted 中有 2 列:dogOwnerNo 和 catOwnerNo 以及 2 个外键。但是桌子的设计似乎没有意义:不管谁拥有它,宠物肯定要么是狗要么是猫(或其他东西)?

    这是另一种设计:

    CREATE TABLE owner(
     ownerNo VARCHAR(8) CONSTRAINT ownerNo_pk2 PRIMARY KEY,
     ownerName VARCHAR(10)
    );
    
    CREATE TABLE petsAdopted(
     petNo VARCHAR(8) CONSTRAINT petNo_pk PRIMARY KEY,
     petType VARCHAR2(10) NOT NULL CONSTRAINT petTypeChk (CHECK petType in ('CAT','DOG'))
     ownerNo VARCHAR(8) CONSTRAINT ownerNo_fk REFERENCES owner(ownerNo)
    );
    

    【讨论】:

    • 这些不是我正在使用的实际表格!我正在尝试为课堂做作业,所以我不想使用问题中给出的实际表格。我想我现在已经弄清楚了,您的回复引发了我的理解。感谢您抽出宝贵时间回复!
    【解决方案2】:

    这仅解决您答案的语法部分,您有很多语法错误,但这不起作用,请重新考虑您的设计。

     CREATE TABLE dogOwner(
     ownerNo VARCHAR(8) CONSTRAINT ownerNo_pk1 PRIMARY KEY,
     ownerName VARCHAR(10)
    );
    
    CREATE TABLE catOwner(
     ownerNo VARCHAR(8),
     ownerName VARCHAR(10),
     CONSTRAINT ownerNo_pk2 PRIMARY KEY (ownerNo),
     CONSTRAINT ownerNo_fk1  FOREIGN KEY (ownerNo) REFERENCES dogOwner(ownerNo)
    );
    
    CREATE TABLE petsAdopted(
     petNo VARCHAR(8) ,
     ownerNo VARCHAR(8),
    CONSTRAINT petNo_pk PRIMARY KEY (petNo),
    CONSTRAINT ownerNo_fk_pet1 FOREIGN KEY (ownerNo) REFERENCES dogOwner(ownerNo),
    CONSTRAINT ownerNo_fk_pet2  FOREIGN KEY (ownerNo) REFERENCES catOwner(ownerNo)
    );
    

    【讨论】:

    • 这行不通,因为ownerno 必须引用现有值。假设你有一个拥有ownerno = 'one' 的狗主人和一个拥有ownerno = 'two' 的猫主人,那么你可以在petsadopted 中插入引用狗主人的行,因为它会违反catowner 的FK
    • 知道了,你说的设计是错误的,我的回答只针对语法部分,但不针对概念部分,我将在回答中编辑并提及。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多