将外键组合到不同的表时遇到问题。例如,我创建了一个表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'。
如何添加外键?
答案 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