在插入前检查2列中的重复项,涉及null,sql server

hivapdat  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(399)

目前我有一个带有primarykey、column1和column2的table1。我的目标是,在将数据插入表之前检查column1+column2是否唯一。
示例:表中的当前数据


**Primary key           column1           column2**

     1                    1               banana
     2                   NULL              NULL
     3                    2                NULL
     4                    1                NULL

应成功插入以下数据:


**Primary key           column1           column2**

       5                   1               apple
       6                   3               banana
       7                   4                NULL

如果未能插入以下数据:


**Primary key           column1           column2**

       8                   1               banana
       9                   2                NULL

我想使这两个文件唯一,但我不能,因为我不能填补空值的数据现在。输入图像描述这里

zzzyeukh

zzzyeukh1#

您可以将表定义为:

create table t (
  a int primary key not null,
  b int,
  c varchar(10),
  constraint uq1 unique (b, c)
);

insert into t (a, b, c) values (1, 1, 'banana');
insert into t (a, b, c) values (2, null, null);
insert into t (a, b, c) values (3, 2, null);
insert into t (a, b, c) values (4, 1, null);
insert into t (a, b, c) values (5, 1, 'apple');
insert into t (a, b, c) values (6, 3, 'banana');
insert into t (a, b, c) values (7, 4, null);
insert into t (a, b, c) values (8, 1, 'banana'); -- fails
insert into t (a, b, c) values (9, 2, null); -- fails

请参见在sql<>fiddle上运行示例。
重要提示:您在SQLServer中看到的行为偏离了sql标准——我甚至认为这是错误的。sql server考虑 NULL 作为一个真正的独特价值,但它不应该;在sql中 null 意思是“一个存在但缺失的值,而不是没有值”。相比之下,我所知道的所有其他数据库 NULL 作为一个非值,一个缺失的值,不能与另一个进行比较 NULL . 由于此异常,此解决方案只能在sql server中工作。

d6kp6zgx

d6kp6zgx2#

你可以用 EXCEPT 操作员:

INSERT INTO table1  (column1,column2) 
SELECT 1, NULL

EXCEPT

SELECT column1,column2
FROM table1 ;
qyuhtwio

qyuhtwio3#

可以在该表上创建唯一约束。

ALTER TABLE TableName 
ADD CONSTRAINT UNIQUE (column1, column2);

相关问题