当字段为NULL时,不会调用唯一约束键

时间:2017-07-28 11:57:35

标签: sql-server tsql

我有一个名为 AQI 的表,其中包含以下列 enter image description here

datepollutant_codesource_idtime只能存在一个唯一值,因此我定义了一个唯一约束{ {1}}。

和upsert查询一样

source_code_time_uq

当所有字段都可用时,upsert方法正常工作,但当我将INSERT INTO aqi(source_id, source_type, pollutant_code, "date", "time", aqi_value) VALUES (4, 1 ,'PM2.5','2018-05-28',8, 789) ON CONFLICT ON CONSTRAINT source_code_time_uq DO UPDATE SET aqi_value = 789 放入NULL列时(试图使该行代表一整天的AQI数据),{ {1}}约束没有被调用,它仍然插入一个新行。

那么如何在也可以time的字段上添加唯一约束检查​​,是否需要更新我的upsert查询?

2 个答案:

答案 0 :(得分:1)

您可以使用已过滤的唯一索引:

create unique index unq_aqi_4 on (date, pollutant_code, source_id, time)
    where time is not null;

然后,您可能还希望每天只保证一行NULL行,所以:

create unique index unq_aqi_4 on (date, pollutant_code, source_id)
    where time is null;

当然,也要删除unique约束。

答案 1 :(得分:0)

唯一约束的问题是它将允许一个null,因此我们可能必须将列定义为非null。希望这有帮助