为什么我的创建表失败了? - 与主键不匹配

时间:2018-03-29 08:02:43

标签: sql sql-server

这就是我想要创建的内容:

CREATE TABLE VEHICLEREPORT 
(
    DeptID char(2)    not null,
    Vin#   char(3)    not null,         
    Miles  varchar(6) not null,
    Bill#  char(3)    not null,
    EID    char(3)    not null,

    PRIMARY KEY (DeptID, Vin#),
    FOREIGN KEY (bill#) REFERENCES billing,
    FOREIGN KEY (EID) REFERENCES Employee
);

问题在于我对结算的提及。错误说:

  

外键'FK__VEHICLERE__Bill #__ 5AEE82B9'的引用列列表中的列数与引用表'Billing'中主键的列数不匹配。

但我的结算表输入正常:

CREATE TABLE BILLING 
(
    VIN#  char(3),      
    BILL# char(3),      

    PRIMARY KEY (VIN#, Bill#),
    FOREIGN KEY (VIN#) REFERENCES vehicle
);

我对此缺少什么?

感谢帮助。

1 个答案:

答案 0 :(得分:1)

如果您认为外键是在两个表之间建立父子关系,那么父侧列必须是唯一的。

来自Wikipedia

  

在关系数据库的上下文中,外键是一个表中的一个字段(或字段集合),它唯一地标识另一个表或同一个表的一行。 ...简单来说,外键在第二个表中定义,但它引用第一个表中的主键或唯一键。

在您的示例中,无法保证VIN#在VEHICLEREPORT中是唯一的。以下是您的选择

  1. VIN#在VEHICLEREPORT中保证是唯一的。在这种情况下,在VEHICLEREPORT表上的VIN#上添加UNIQUE约束。错误将消失。
  2. VIN#在VEHICLEREPORT中并不是唯一的(似乎不太可能)。如果是这种情况,那么BILLING表的设计可能存在缺陷,因为它可能指向VEHICLEREPORT中的多行。您应该考虑将DeptID列添加到BILLING并创建复合外键。
  3. 此外,如果VIN#是唯一的(上面的案例1),您应该考虑为什么DeptID存在于PK中。也许最后的正确修复是从主键中删除DeptID。

相关问题