【问题标题】:No Primary or candidate keys in the referenced table that match column list in foreign key引用表中没有与外键中的列列表匹配的主键或候选键
【发布时间】:2019-04-11 07:06:03
【问题描述】:

我正在尝试创建一些基本的 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 很陌生,我可能会错过它。

【问题讨论】:

  • 支付应该有paymentid作为主键,购物车应该有cartid。后者将解决您的错误!

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


【解决方案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),
)

【讨论】:

    【解决方案2】:

    由于表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】:

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

      【讨论】:

        【解决方案4】:

        它是 Cart 表上的主键。

        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])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-25
          • 2013-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-05
          相关资源
          最近更新 更多