Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server Management Studio-复合主键_Sql Server_Ssms - Fatal编程技术网

Sql server SQL Server Management Studio-复合主键

Sql server SQL Server Management Studio-复合主键,sql-server,ssms,Sql Server,Ssms,我有一个带有复合主键的表(SQLServer2008)。我如何防止这种行为 insert into myTable values ('A','B') insert into myTable values ('B','A') 我尝试了使用“唯一限制”和“忽略”和“重复”键,但我无法解决它 提前谢谢 我认为在插入之前,您可以检查两列中是否存在组合“B”和“A” Declare @t1 table(col1 varchar(2),col2 varchar(2)) insert into @t1 v

我有一个带有复合主键的表(SQLServer2008)。我如何防止这种行为

insert into myTable values ('A','B')
insert into myTable values ('B','A')
我尝试了使用“唯一限制”和“忽略”和“重复”键,但我无法解决它


提前谢谢

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

 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
也可以定义约束


感谢您提出的好问题。

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

alter table myTable add constraint chk_pk 
   check (col1_1 <= col_2);
alter table myTable add constraint chk\u pk
检查(第1列第1列第2列,然后第1列其他第2列结束;
在myTable上创建唯一索引idx_UNIQUE_pk(最小值、最大值);
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);