SQL SERVER UNIQUE仅在其他列值不同时

时间:2017-11-20 06:04:26

标签: sql-server

我需要有特定唯一术语的桌面设计方面的帮助。 该表将如下所示。

id --> Primary key auto generate
type1 --> varchar(20)
type2 --> varchar(20)
code --> int

代码列是唯一的,但仅当列type2具有相同的值时才允许相同的值。

1  xyz  freedom  6773
2  asd  freedom  6773
3  rty  prison   6773 --> not allowed
4  pop  prison   7809

4 个答案:

答案 0 :(得分:2)

作为variat,你可以使用附加表和(code,type2)的所有可能组合。

CREATE TABLE checkTable(
  code int NOT NULL,
  type2 varchar(20) NOT NULL,
CONSTRAINT PK_checkTable_code PRIMARY KEY(code),
CONSTRAINT UK_checkTable_type2 UNIQUE(type2),
CONSTRAINT UK_checkTable_code_type2 UNIQUE(code,type2) -- it's using for FK in your table
)

CREATE TABLE yourTable(
  id int IDENTITY NOT NULL,
  type1 varchar(20),
  type2 varchar(20),
  code int,
CONSTRAINT PK_yourTable PRIMARY KEY(id),
CONSTRAINT FK_yourTable_code_type2 FOREIGN KEY(code,type2) REFERENCES checkTable(code,type2)
)

我希望我理解你想要的东西。

答案 1 :(得分:1)

我认为触发器在您的情况下可能有用...下面是伪代码

create trigger trg_test
on table1
after insert
as
begin

if exists(
Select  * from inserted  i
          join
          tab1e1 t1
          on t1.code=i.code and i.type2<>t1.type2
          )
Rollback;
end

有些测试::

以下代码失败

insert into table1
values
('prison',6773)

以下代码成功

insert into table1
values
('prison',6774)

答案 2 :(得分:0)

只要您想插入相同的值,就无法将代码定义为UNIQUE列。

对于您的情况,我建议删除id(自动增加主键)并将type02 +代码作为Composite主键。

答案 3 :(得分:0)

如果您想要允许相同的值,即使存在条件(甚至无法将条件置于索引中),也无法使列唯一

您需要在应用程序中处理验证。