您好,我有一个简单的表
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之间添加关系我得到错误 该列与现有主键或唯一约束
不匹配现在关联这两个表的正确方法是什么?
谢谢。
答案 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
是主键?如果它已经是唯一的 - >那么为什么要在主键上添加两列呢???