sql server添加外键列与现有主键或唯一约束不匹配

时间:2013-09-18 14:39:37

标签: sql-server

您好,我有一个简单的表

CREATE TABLE [dbo].[PRICING](
    [ID_PRICE] [int] NOT NULL,
    [DATA_START] [datetime] NOT NULL,
    [DATA_END] [datetime] NOT NULL,
 CONSTRAINT [PK_PRICING] PRIMARY KEY CLUSTERED 
(
    [ID_PRICE] ASC,
    [DATA_START] ASC,
    [DATA_END] 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

主键由3列组成(我需要这个三键)

现在我需要将它与另一个表格相关联,比如

CREATE TABLE [dbo].[MOV](
    [ID_MOV] [int] IDENTITY(1,1) NOT NULL,
    [SALDO] [float] NOT NULL,
    [ID_PRICING_BUY] [int] NOT NULL,
    [ID_PRICING_SELL] [int] NOT NULL,
 CONSTRAINT [PK_MOV] PRIMARY KEY CLUSTERED 
(
    [ID_MOV] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

当我尝试将外键添加到第二个表时,在表MOV中的ID_PRICING_BUY和表PRICING中的ID_PRICE之间添加关系我得到错误 该列与现有主键或唯一约束

不匹配

现在关联这两个表的正确方法是什么?

谢谢。

1 个答案:

答案 0 :(得分:3)

如果您的PRICING表中有3列复合主键,那么引用的所有外键也必须包含所有三列

ALTER TABLE dbo.MOV
ADD CONSTRAINT FK_MOV_PRICING
FOREIGN KEY(ID_PRICING_BUY, -new-column-for-start-date-, -new-column-for-end-date-)
REFERENCES dbo.PRICING(ID_PRICE, DATA_START, DATA_END)

外键不能仅引用主键的一部分。

唯一的另一个选择是在dbo.Pricing(ID_Price)上创建唯一索引 - 然后您可以从外键引用该唯一约束。

但是,如果你只能在dbo.Pricing(ID_Price)上创建一个唯一索引,真正的问题就变成为什么不仅仅ID_Price是主键?如果它已经是唯一的 - >那么为什么要在主键上添加两列呢???