我创建了一个这样的表:
CREATE TABLE IF NOT EXISTS report (
id IDENTITY PRIMARY KEY,
group_id INT NOT NULL,
group_type VARCHAR(25) NOT NULL,
device_item_id INT NOT NULL,
device_name TEXT NOT NULL,
item_id INT NULL,
item_name TEXT NULL,
device_ip VARCHAR(45) NOT NULL
from_tstamp TIMESTAMP NOT NULL,
to_tstamp TIMESTAMP NOT NULL
version INT NOT NULL
CONSTRAINT report_unique_constraint
UNIQUE (group_id, group_type, device_item_id, item_id, from_tstamp, to_tstamp)
);
用例是,当group_type
为'A'时,item_id
将永远不会被设置,并且将始终为NULL
。当group_type
为'B'时,则item_id
也有一个值。
因此,当group_type为'A'时,H2数据库允许插入以下两条记录:
1,335640,A,5316,d_name,NULL,NULL,192.168.1.1,2022-04-17 00:00:00.000000,2022-04-23 23:59:59.000000,0
2,335640,A,5316,d_name,NULL,NULL,192.168.1.1,2022-04-17 00:00:00.000000,2022-04-23 23:59:59.000000,1
为了方便读取,这些值是来自上述2条记录的唯一键约束的一部分:
335640,A,5316,NULL,2022-04-17 00:00:00.000000,2022-04-23 23:59:59.000000
问题:为什么item_id中的NULL被忽略,而允许输入2条类似的记录?是否有一种方法,NULL item_id也被认为是相同的值时,强制约束?
解决方案
一个解决方案,我已经实现了克服这一点,现在是使item_id NOT NULL在数据库中,当group_type是' A ',然后插入一个虚拟值-99。这使得唯一约束按照期望的方式运行。就像黑客一样!!
NULL不等于NULL。因此,如果两个记录在列列表中具有相同的值并且其中一个或多个列值为NULL则这两个记录不相同因此唯一约束不会阻止两个记录都插入到DB