【问题标题】:Error when setting foreign key in SQL Server在 SQL Server 中设置外键时出错
【发布时间】:2016-09-03 19:39:03
【问题描述】:

我运行以下查询以在 MS SQL Server 中创建表:

CREATE TABLE menus
(
  menu_id int NOT NULL PRIMARY KEY,
  menu_name char,
  other_details char
)

CREATE TABLE bookings
(
  booking_Id int NOT NULL PRIMARY KEY,
  date_booked DATE,
  date_of_booking DATE,
  other_details char,
  staff_id int FOREIGN KEY REFERENCES staff(staff_id),
  customer_id int FOREIGN KEY REFERENCES customers(customer_id)
)

CREATE TABLE menus_booked
(
  menu_id INT NOT NULL,
  booking_id INT NOT NULL,
  CONSTRAINT PK_menus_booked PRIMARY KEY(menu_id,booking_id),
  FOREIGN KEY (menu_id) REFERENCES menus(menu_id),
  FOREIGN KEY (booking_id) REFERENCES bookings(booking_id)
)

CREATE TABLE menu_changes
(
  change_id int NOT NULL PRIMARY KEY,
  menu_id int NOT NULL,
  booking_id int NOT NULL,
  change_details char,
  FOREIGN KEY (menu_id) REFERENCES menus_booked(menu_id),
  FOREIGN KEY (booking_id) REFERENCES menus_booked(booking_id)
)

在运行最后一个查询时出现错误:

被引用表“menus_booked”中没有与外键“FK_menu_chan_menu”中的引用列列表匹配的主键或候选键

我不确定我的查询是否正确并且无法解决此错误。

【问题讨论】:

  • 在前3个表中输入一些数据,然后执行最后的create table语句@Imraan

标签: sql sql-server foreign-keys ddl create-table


【解决方案1】:

menus_booked 的主键是menu_idbooking_id 的唯一组合。一个外来者必须指向那个组合,而不仅仅是它的一个领域,这不一定是唯一的。您的查询当前尝试定义两个外键,每列一个,而不是列组合上的一个外键:

CREATE TABLE menu_changes
(
    change_id int NOT NULL PRIMARY KEY,
    menu_id int NOT NULL,
    booking_id int NOT NULL,
    change_details char,
    FOREIGN KEY (menu_id, booking_id) 
        REFERENCES menus_booked(menu_id, booking_id) -- Here!
)

【讨论】:

    【解决方案2】:

    外键必须引用primary key(或unique key,但这里是PK 问题),并且必须完整引用它。

    FOREIGN KEY (menu_id) REFERENCES menus_booked(menu_id),
    FOREIGN KEY (booking_id) REFERENCES menus_booked(booking_id)
    

    menus_booked 的主键有两个外键引用部分。您必须将其更改为:

    FOREIGN KEY (menu_id, booking_id) REFERENCES menus_booked(menu_id, booking_id)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 2019-02-20
      • 2014-12-25
      • 1970-01-01
      相关资源
      最近更新 更多