首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复合主键

复合主键
EN

Stack Overflow用户
提问于 2013-12-12 07:44:41
回答 2查看 424关注 0票数 1

我有一个带有复合主键的表( Server 2008)。我怎样才能防止这种行为?

代码语言:javascript
复制
insert into myTable values ('A','B')
insert into myTable values ('B','A')

我尝试了独特的限制和WITH_IGNORE_DUP_KEYS,但我无法解决它。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-12 08:01:11

由于Server不允许基于函数的索引,一种解决方案是强制插入值,以便“较小”的值总是存储在第一列中:

代码语言:javascript
复制
alter table myTable add constraint chk_pk 
   check (col1_1 <= col_2);

如果您不喜欢这样(因为您不希望在insert期间强制对值进行特殊的“排序”),则需要定义两个计算列并在它们上创建一个唯一的索引:

代码语言:javascript
复制
ALTER TABLE myTable ADD 
    min_pk AS case when col_1 < col_2 then col_1 else col_2 end,
    max_pk AS case when col_1 > col_2 then col_1 else col_2 end;

CREATE UNIQUE INDEX idx_unique_pk ON myTable (min_pk, max_pk);
票数 2
EN

Stack Overflow用户

发布于 2013-12-12 07:59:19

我认为在插入之前,您可以检查两列中是否存在组合“B”和“A”

代码语言:javascript
复制
 Declare @t1 table(col1 varchar(2),col2 varchar(2))
insert into @t1 values('A','B')

if not exists(select col1 from @t1 where ((col1='B' or Col1='A') and (col2='B' or Col2='A')))
insert into @t1 values('B','A')

select * from @t1

或者你可以定义约束。

谢谢你的好问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20537766

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档