【问题标题】:Contains no primary or candidate keys that match the referencing不包含与引用匹配的主键或候选键
【发布时间】:2017-04-15 03:43:08
【问题描述】:

SQL71516 :: 引用的表 '[dbo].[MSTransaction]' 不包含与外键中的引用列列表匹配的主键或候选键。如果引用的列是计算列,它应该被持久化。

这是我收到的错误。有什么解决办法吗?下面是两个表的 SQL 代码:

CREATE TABLE [dbo].[MSOrderline] 
(
    [PurchaseID] NCHAR (200) NOT NULL,
    [ProductID]  NCHAR (200) NOT NULL,
    [Quantity]   INT         NULL,

    CONSTRAINT [DoubleMS_PK] 
        PRIMARY KEY CLUSTERED ([PurchaseID] ASC, [ProductID] ASC),
    FOREIGN KEY ([PurchaseID]) REFERENCES [dbo].[MSTransaction] ([PurchaseID]),
    FOREIGN KEY ([ProductID]) REFERENCES [dbo].[MSProducts] ([ProductID])
);

CREATE TABLE [dbo].[MSTransaction] 
(
    [TransactionID] NCHAR (200) NOT NULL,
    [EmployeeID]    NCHAR (200) NULL,
    [CustomerID]    NCHAR (200) NULL,
    [PurchaseID]    NCHAR (200) NOT NULL,
    [Amount]        INT         NULL,
    [TotalAmount]   INT         NULL,
    [TimeOfSale]    NCHAR (200) NULL,
    [DiscountID]    NCHAR (200) NULL,

    PRIMARY KEY CLUSTERED ([TransactionID] ASC),

    FOREIGN KEY ([DiscountID]) REFERENCES [dbo].[MSDiscount] ([DiscountID]),
    FOREIGN KEY ([EmployeeID]) REFERENCES [dbo].[MSEmployee] ([EmployeeID]),
    FOREIGN KEY ([CustomerID]) REFERENCES [dbo].[MSCustomer] ([CustomerID])
);

我知道以前有人问过这个问题,但它要么在我的情况下不起作用,要么在我的情况下无法工作。

【问题讨论】:

  • 长字符字段对于主键来说是个坏主意。

标签: sql sql-server database


【解决方案1】:

正如 Gordon Linoff 所说,这些 NCHAR(200) 是集群键的糟糕选择。

您必须先创建要引用的表。要使用PurchaseId 作为键,它必须是unique

sql server 中的示例:

CREATE TABLE [dbo].[MSTransaction] (
    [TransactionID] NCHAR (200) NOT NULL,
    [EmployeeID]    NCHAR (200) NULL,
    [CustomerID]    NCHAR (200) NULL,
    [PurchaseID]    NCHAR (200) NOT NULL unique,
    [Amount]        INT         NULL,
    [TotalAmount]   INT         NULL,
    [TimeOfSale]    NCHAR (200) NULL,
    [DiscountID]    NCHAR (200) NULL,
    PRIMARY KEY CLUSTERED ([TransactionID] ASC)
    --,FOREIGN KEY ([DiscountID]) REFERENCES [dbo].[MSDiscount] ([DiscountID]),
    --FOREIGN KEY ([EmployeeID]) REFERENCES [dbo].[MSEmployee] ([EmployeeID]),
    --FOREIGN KEY ([CustomerID]) REFERENCES [dbo].[MSCustomer] ([CustomerID])
);
CREATE TABLE [dbo].[MSOrderline] (
    [PurchaseID] NCHAR (200) NOT NULL,
    [ProductID]  NCHAR (200) NOT NULL,
    [Quantity]   INT         NULL,
    CONSTRAINT [DoubleMS_PK] PRIMARY KEY CLUSTERED ([PurchaseID] ASC, [ProductID] ASC),
    FOREIGN KEY ([PurchaseID]) REFERENCES [dbo].[MSTransaction] ([PurchaseId]),
    --FOREIGN KEY ([ProductID]) REFERENCES [dbo].[MSProducts] ([ProductID])
);

rextester 演示:http://rextester.com/ZVZD33282

对聚类键做出更好选择的参考:

【讨论】:

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