Carsten Flokstra
Carsten Flokstra

Reputation: 65

There are no primary or candidate keys in the referenced table error

I have a problem with combining foreign keys to different tables. For example I made a table Customers and a Table invoices. I want a foreign key from Customers to invoices so I can get the name and everything of the Customer:

Create table code of 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)
)

Create table code of 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)
) 

The foreign key code that I want to use:

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

It throws the following error:

There are no primary or candidate keys in the referenced table 'Customers' that match the referencing column list in the foreign key 'fk_Customers_Invoices'.

How can I add my foreign key?

Upvotes: 1

Views: 3611

Answers (2)

marc_s
marc_s

Reputation: 754348

Since your Customers table defines this primary key:

Constraint pk_Customers 
   PRIMARY KEY (customerID, customer_email, username)

any table that wants to reference Customers must provide all three columns of that primary key. That's the way FK constraints work.

So from your Invoices tables, you must provide all 3 columns that make up the primary key of Customers - not just one. You can never refernce only part of a primary key - it's the whole key or nothing....

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

You can either:

  • change the PK for Customers to be just CustomerID which would make a whole lot more sense since it's an identity column

  • or you could add the other two columns in the Customers PK to yoru table Invoices

Upvotes: 1

cf_en
cf_en

Reputation: 1661

I think it's because your primary key is a composite key:

customerID, customer_email, username

This suggests that it is only the combination of these three fields that will uniquely identify a customer, and the foreign key would need to reference all three fields.

If customerID is unique, then it should be the primary key for the table and your foreign keys would be able to use it as a reference.

For what purpose are the other fields included in the primary key?

Upvotes: 2

Related Questions