在参考表中没有与外键中的列列表匹配的主键或候选键

时间:2019-04-11 07:06:04

标签: sql sql-server foreign-keys sql-server-2016 ddl

我正在尝试创建一些基本的SQL表,但是不断出现以下错误:

  

在引用表'CART'中没有与外键'FK__ORDERS__CART_ID__2B3F6F97'中的引用列列表匹配的主键或候选键

这是我正在使用的当前代码。

create table USERS
(
    User_ID int NOT NULL primary key,
    Address varchar(30) NOT NULL,
    Email varchar(30) NOT NULL,
    Password varchar(30) NOT NULL,
    Phone varchar(30) NOT NULL,
    F_Name varchar(30) NOT NULL,
    L_Name varchar(30) NOT NULL,
    Date_of_Birth varchar(30) NOT NULL
)

create table PAYMENT
(
    User_ID int NOT NULL primary key,
    Credit_Card varchar(30) NOT NULL,
    Debit_Card varchar(30) NOT NULL,
    Google_Pay varchar(30) NOT NULL,
    Apple_Pay varchar(30) NOT NULL,
    Paypal varchar(30) NOT NULL,
    foreign key (User_ID)
    references USERS(User_ID)
)

create table CART
(
    User_ID int NOT NULL,
    Cart_ID int NOT NULL,
    Total_Price float NOT NULL,
    primary key (Cart_ID, User_ID),
    foreign key(User_ID)
    references USERS(User_ID)
)

create table ORDERS
(
    Order_ID int NOT NULL primary key,
    Total_Price float NOT NULL,
    Payment_Method varchar(30) NOT NULL,
    User_ID int NOT NULL,
    CART_ID int NOT NULL,
    foreign key (User_ID)
    references USERS(User_ID),
    foreign key (Cart_ID)
    references CART(Cart_ID),
)

create table ORDER_HISTORY
(
    User_ID int NOT NULL,
    Order_ID int NOT NULL,
    primary key (User_ID, Order_ID),
    foreign key (User_ID)
    references USERS(User_ID),
    foreign key (Order_ID)
    references ORDERS(Order_ID)
)

我尝试修改并移动它们,但是无法消除错误。我怀疑这可能非常简单和明显,但是由于我对SQL还是很陌生,所以我可能会错过它。

4 个答案:

答案 0 :(得分:1)

cart具有复合主键(cart_id, order_id)。这些列中的每一个都不是独立的主键,而不仅仅是它们的组合。 orders中的外键应具有相同的作用-您应基于两者的组合使用一个外键:

create table ORDERS
(
    Order_ID int NOT NULL primary key,
    Total_Price float NOT NULL,
    Payment_Method varchar(30) NOT NULL,
    User_ID int NOT NULL,
    CART_ID int NOT NULL,
    foreign key (User_ID)
    references USERS(User_ID),
    foreign key (Cart_ID, User_id) -- here
    references CART(Cart_ID, User_id),
)

答案 1 :(得分:0)

在表Cart中,您需要使用PRIMARY KEY定义Cart_ID。如果由于某种原因您不能或不想定义PRIMARY KEY,请在同一列上尝试UNIQUE KEY约束。

答案 2 :(得分:0)

由于表CART具有复合主键,因此您应该引用复合主键:

 create table ORDERS
(
    Order_ID int NOT NULL primary key,
    Total_Price float NOT NULL,
    Payment_Method varchar(30) NOT NULL,
    User_ID int NOT NULL,
    CART_ID int NOT NULL,
    foreign key (User_ID)
    references USERS(User_ID),
    foreign key (Cart_ID, User_ID)
    references CART(Cart_ID, User_ID),
)

答案 3 :(得分:0)

它是购物车表上的主键。

CREATE TABLE [dbo].[CART](
    [User_ID] [int] NOT NULL,
    [Cart_ID] [int] NOT NULL,
    [Total_Price] [float] NOT NULL,
 CONSTRAINT [PK__CART__D6AB58B9B18E85A5] PRIMARY KEY CLUSTERED 
(
    [User_ID] ASC,
    [Cart_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[CART]  WITH CHECK ADD FOREIGN KEY([User_ID])
REFERENCES [dbo].[USERS] ([User_ID])