引用的表错误中没有主键或候选键

时间:2016-02-25 10:26:00

标签: sql sql-server foreign-keys

将外键组合到不同的表时遇到问题。例如,我创建了一个表Customers和一个Table发票。我想要客户的外键发票,这样我就能得到客户的名字和一切:

创建Customers的表格代码:

Create Table Customers
(
    customerID int IDENTITY(100,1) NOT NULL, 
    customer_email varchar(30) NOT NULL,
    username varchar(255) NOT NULL,
    password varchar(50) NOT NULL,
    firstname varchar(255) NOT NULL,
    lastname varchar(255) NOT NULL,
    insertion varchar(10)   NULL,
    phonenumber int NULL,
    streetname varchar(20) NOT NULL,
    number  int NOT NULL,
    zipcode varchar(10) NOT NULL,
    city    varchar(255) NOT NULL,

    Constraint pk_Customers 
       PRIMARY KEY (customerID, customer_email, username)
)

创建Invoices的表格代码:

Create Table Invoices 
(
    invoiceID int IDENTITY(1000,1) NOT NULL,
    customer_email varchar(30) NOT NULL,
    customerID int NOT NULL,
    creationdate datetime NOT NULL DEFAULT GETDATE(),
    totalAmount decimal(5,2) NOT NULL,

    Constraint pk_Invoices 
        PRIMARY KEY (invoiceID, customer_email,creationdate)
) 

我想使用的外键代码:

ALTER Table Invoices
ADD Constraint fk_Customers_Invoices 
FOREIGN KEY (customerID) REFERENCES Customers (customerID)
   ON UPDATE CASCADE 
   ON DELETE NO ACTION

它会抛出以下错误:

  

参考表中没有主键或候选键'客户'与外键中的引用列列表匹配' fk_Customers_Invoices'。

如何添加外键?

2 个答案:

答案 0 :(得分:2)

我认为这是因为您的主键是复合键:

customerID, customer_email, username

这表明只有这三个字段的组合才能唯一地标识客户,而外键需要引用所有三个字段。

如果customerID是唯一的,那么它应该是表的主键,并且您的外键可以将它用作参考。

主键中包含其他字段的目的是什么?

答案 1 :(得分:1)

由于您的Customers表定义了此主键:

Constraint pk_Customers 
   PRIMARY KEY (customerID, customer_email, username)

任何想要引用Customers 的表都必须提供该主键的所有三列。这就是FK约束的工作方式。

因此,从您的Invoices表中,必须提供构成Customers主键的所有3列 - 而不仅仅是一个。您从不只能引用主键的一部分 - 它是整个键或什么都不是....

ALTER Table Invoices
ADD Constraint fk_Customers_Invoices 
FOREIGN KEY (customerID) REFERENCES Customers (customerID)
   ON UPDATE CASCADE 
   ON DELETE NO ACTION

您可以

  • Customers的PK更改为CustomerID,因为它是身份

  • 或者您可以将Customers PK中的其他两列添加到yoru表Invoices