复合键的独特组合

时间:2013-03-01 15:40:32

标签: sql sql-server database tsql

我想创建具有复合键的表,其组合必须是唯一的。

例如,

CREATE TABLE [dbo].[TEST3](
    [field1][int] NOT NULL,
    [field2][int] NOT NULL
PRIMARY KEY (field1,field2)
)
GO

行:

field1    field2
----------------
   1        2
   2        1

如何预防此类行为?当用户将行(2,1)插入已有行(1,2

的表时,我需要输入错误

2 个答案:

答案 0 :(得分:2)

你可以使用用户定义的类型来做到这一点,但恕我直言,这听起来像一个糟糕的设计,可能是一个XY问题。

如果您正在尝试创建多对多表格(例如,共享朋友的表格),我建议您使用检查约束来始终确保field1严格小于field2

您甚至可以更进一步,并且需要使用存储过程来插入行,或者创建INSTEAD OF INSERT触发器。这将为您排列正确的行,这样您就不必依赖前端知道列应该在哪个顺序。

答案 1 :(得分:1)

一些插入(和更新)触发器可能是解决方案,即

create trigger prevent 
on TEST3 
for insert 
as 
if (select count(1) 
    from TEST3, inserted 
    where TEST3.field1=inserted.field2 and TEST3.field2=inserted.field1) > 0  
/* Cancel the insert and print a message.*/
  begin
    rollback transaction 
    print "Failed." 
  end  
/* Otherwise, allow it. */
else
  print "Added!"