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

Sql 引用的表错误中没有主键或候选键,sql,sql-server,foreign-keys,Sql,Sql Server,Foreign Keys,我无法将外键组合到不同的表中。例如,我做了一张客户表和一张发票表。我希望从客户处获得发票的外键,以便我可以获得客户的姓名和所有信息: 创建客户的表代码: Create Table Customers ( customerID int IDENTITY(100,1) NOT NULL, customer_email varchar(30) NOT NULL, username varchar(255) NOT NULL, password varchar(50)

我无法将外键组合到不同的表中。例如,我做了一张客户表和一张发票表。我希望从客户处获得发票的外键,以便我可以获得客户的姓名和所有信息:

创建
客户的表代码

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)
)
创建发票的表代码:

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
它抛出以下错误:

引用的表“Customers”中没有与外键“fk_Customers_Invoices”中的引用列列表匹配的主键或候选键


如何添加外键?

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

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

如果customerID是唯一的,那么它应该是表的主键,外键可以将其用作引用


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

因为您的
客户表定义了此主键:

Constraint pk_Customers 
   PRIMARY KEY (customerID, customer_email, username)
任何要引用客户的表必须提供主键的所有三列。这就是FK约束的工作方式

因此,从
发票
表中,必须提供构成
客户
主键的所有3列
——而不仅仅是一列。您可以从不只引用主键的一部分-它是整个键或什么都不引用

ALTER Table Invoices
ADD Constraint fk_Customers_Invoices 
FOREIGN KEY (customerID) REFERENCES Customers (customerID)
   ON UPDATE CASCADE 
   ON DELETE NO ACTION
您可以其中一个

  • Customers
    的主键更改为仅
    CustomerID
    ,这将更有意义,因为它是一个标识列

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


有点奇怪的结构。如果
CustomerID
是一个
identity
列,那么为什么在
主键中还有其他列?你的两个PK都必须通过身份认证。我甚至无法想象对客户电子邮件+创作日期进行独特限制的目的是什么。。。您将收到一个错误,因为您的PK由三列组成,但您试图仅用一列引用它。一列不足以定位由三列标识的记录。按照我上面提到的方法修复你的PKs,FK可以正常工作。可能是重复的,但有了这个功能,我仍然可以使用UNIQUE功能,对吗?@CarstenFlokstra:不确定你指的是什么-
UNIQUE
on/for what?!?!?数据库中有客户电子邮件和用户名的唯一值。在客户电子邮件地址中有用户名的副本是很奇怪的。@CarstenFlokstra:在这种情况下,将
CustomerID
单独作为PK!这是最有意义的。在其他表格中也没有“用户名”和“客户电子邮件”地址的“副本”。。。。为了确保
(用户名、客户电子邮件)
的唯一性,您可以始终对这两列设置唯一的约束-它们不需要是PK的一部分!