强制主键存在于另一个多列主键中

时间:2015-03-15 14:39:13

标签: sql sql-server relational-database relationship reverse

我有两张桌子。第一个表有多列作为主键,第二个表有一列主键。数据首先输入表1 FieldPlacement,其中将生成FieldPlacementNum,然后在表2中输入表{1}}中必须存在的记录。

目前有一对多的关系,但我希望反过来表和SQL的关系不允许我这样做。感谢

表1

FieldPlacementNum

表2

CREATE TABLE [dbo].[FieldPlacement]
(
    [ID] [varchar](10) NOT NULL,
    [Year] [varchar](10) NOT NULL,
    [Term] [varchar](10) NOT NULL,
    [PlacementNum] [int] IDENTITY(1,1) NOT NULL,
    [Email] [varchar](70) NULL,

    CONSTRAINT [PK_FieldPlacement] 
      PRIMARY KEY CLUSTERED ([ID] ASC, [Year] ASC, [Term] ASC, [PlacementNum] 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

SET ANSI_PADDING OFF
GO

ALTER TABLE [dbo].[FieldPlacement] WITH CHECK 
   ADD CONSTRAINT [FK_FieldPlacement_FieldPlacementEval1] 
   FOREIGN KEY([PlacementNum])
   REFERENCES [dbo].[FieldPlacementEval] ([PlacementNum])
GO

ALTER TABLE [dbo].[FieldPlacement] 
   CHECK CONSTRAINT [FK_FieldPlacement_FieldPlacementEval1]
GO

1 个答案:

答案 0 :(得分:0)

由于FieldPlacement.PlacementNumIDENTITYNOT NULL且唯一,您还可以将其设为PK,然后只在当前组成的四列上创建唯一索引PK(确保其独特性)。

FieldPlacementEval开始,只需参考PlacementNum即可。

这里的额外好处是FieldPlacement表上的一个更小,更有效的聚类键(因为它只有1列而不是4列 - 并且跳过所有那些对聚类键非常糟糕的可变长度列)