【问题标题】:There are no Primary or Candidate Keys in the referenced table引用的表中没有主键或候选键
【发布时间】:2012-08-26 03:37:23
【问题描述】:

错误:引用的表中没有主键或候选键 'dbo.Customers' 与外文中的引用列列表匹配 键'FK_Reservation_Customers_FrstNme FOREIGN KEY'

DROP TABLE dbo.Customers;
DROP TABLE dbo.Staff;
DROP TABLE dbo.Rooms;
DROP TABLE dbo.Reservation;
GO
CREATE TABLE "Customers"(

    CustomerID int IDENTITY (1,1) NOT NULL,
    FirstName nvarchar(20) NULL,
    LastName nvarchar(20) NULL,
    StreetNo int NULL,
    City nvarchar(20) NULL,
    PostCode nvarchar(20) NULL,
    Email nvarchar(50) NULL,

    CONSTRAINT PK_Customers PRIMARY KEY
    (
        CustomerID
    )
)
CREATE TABLE "Staff"(

    StaffID nvarchar(20) NOT NULL,
    Pass nvarchar(20) NOT NULL,

    CONSTRAINT PK_Staff PRIMARY KEY
    (
        StaffID
    )
)
CREATE TABLE "Rooms"(

    RoomNo int NOT NULL,
    RoomType nvarchar(20) NULL,
    PricePerNight money NULL,
    MaximumOccupancy int NULL,
    No0fBeds int NULL,
    NoOfBathrooms int NULL,
    Entertainment bit NULL,
    RoomService bit NULL,
    Gym bit NULL,

    CONSTRAINT PK_Rooms PRIMARY KEY
    (
        RoomNo
    )
)
CREATE TABLE "Reservation"(

    ReservationID int IDENTITY (1,1) NOT NULL,
    CustomerID int NOT NULL,
    FirstName nvarchar(20) NULL,
    LastName nvarchar(20) NULL,
    RoomType nvarchar(20) NULL,
    RoomNo int NOT NULL,
    CheckInDate date NULL,
    CheckOutDate date NULL,

    CONSTRAINT PK_Reservation PRIMARY KEY
    (
        ReservationID
    ),
    CONSTRAINT FK_Reservation_Customers_CustID FOREIGN KEY
    (
        CustomerID
    )   
        REFERENCES dbo.Customers
        (
            CustomerID
        ),
    CONSTRAINT FK_Reservation_Customers_FrstNme FOREIGN KEY
    (
        FirstName
    )
        REFERENCES dbo.Customers
        (
            FirstName
        )
    )

谁能告诉我这里发生了什么以及如何解决它。我想制作外键的所有其他键都会出现同样的问题。除非我想引用主键。

【问题讨论】:

  • 您尝试添加一个外键映射到一个可以为空的字段,而不是唯一的...顺便说一下,您尝试添加两个外键引用同一个表。你想用第二个键实现什么?

标签: sql sql-server-2012


【解决方案1】:

如果要创建外键,它必须引用主键或具有唯一约束的字段。

如果您想显示客户的姓名,请让外键引用 CustomerID,并通过连接显示结果。

【讨论】:

  • 谢谢你我现在明白了。 - 这也意味着我不会在预订中需要名字和姓氏,如果我要使用连接来显示客户表中的名字和姓氏是否正确?!
  • 没错。除非您担心在预订时知道客户的姓名,否则无论他们随后可能对其姓名进行任何更改
  • 通过将UNIQUE 添加到我试图引用的列中,错误消失了:guid uniqueidentifier NOT NULL UNIQUE
【解决方案2】:

我在引用表中指定的键列与在引用表上定义主键或候选键的顺序不同时遇到了这个错误。

切换列指定的顺序修复了它。

例如:

ALTER TABLE [dbo].[MCL_item_vendor_override_mst]  WITH CHECK ADD  
CONSTRAINT [FK_MCL_item_vendor_override_mst_item_mst] FOREIGN KEY([item],[site_ref])
    REFERENCES [dbo].[item_mst] ([item],[site_ref])

失败了

ALTER TABLE [dbo].[MCL_item_vendor_override_mst]  WITH CHECK ADD  
CONSTRAINT [FK_MCL_item_vendor_override_mst_item_mst] FOREIGN KEY([site_ref],[item])
    REFERENCES [dbo].[item_mst] ([site_ref],[item])

工作。

【讨论】:

  • 嗨,我们可以使用任何一列作为外键引用吗?如果是的话,我们如何使用它
猜你喜欢
  • 1970-01-01
  • 2018-12-25
  • 2022-01-07
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多