首页 > 解决方案 > 尝试在表中插入 UNIQUE 属性的 NULL 值时出现模棱两可的错误消息

问题描述


 CREATE TABLE access_type(
 id NUMBER NOT NULL PRIMARY KEY,
 access_type VARCHAR(10) UNIQUE,
 access_value VARCHAR(2) UNIQUE
 );

案例一:

当我尝试为 access_value 属性插入 NULL 时,我得到以下输出:

sqlite> insert into access_type (id,access_type,access_value) values (3,'execute',NULL);
Error: UNIQUE constraint failed: access_type.access_type

案例二:

当我尝试为 access_type 属性插入 NULL 时,我得到以下输出:

sqlite> insert into access_type (id,access_type,access_value) values (3,NULL,'E');
Error: UNIQUE constraint failed: access_type.access_value

我想知道为什么 sqlite3在第一种情况下为 access_value 插入 NULL 时为 access_type 提供错误,在为access_type插入NULL 时为access_value提供错误。请帮忙

标签: sqliteunique-constraint

解决方案


案例 1没有失败,因为 NULL(NULL 被认为与所有其他 NULL 不同)它失败了,因为在access_type列中已经有一行执行。

即消息告诉您失败(冲突)的唯一约束是access_type列。

案例 2同样失败,因为另一行在id列中有 3。

也许考虑以下(注意 DROP TABLE 以便它可以重新运行):-

DROP TABLE IF EXISTS access_type;
CREATE TABLE IF NOT EXISTS access_type(
 id NUMBER NOT NULL PRIMARY KEY,
 access_type VARCHAR(10) UNIQUE,
 access_value VARCHAR(2) UNIQUE
 );
 insert into access_type (id,access_type,access_value) values (3,'execute',NULL);
 insert into access_type (id,access_type,access_value) values (4,NULL,'E');
 insert into access_type (id,access_type,access_value) values (5,NULL,NULL);

运行时的消息是:-

insert into access_type (id,access_type,access_value) values (3,'execute',NULL)
> Affected rows: 1
> Time: 0.091s


-- insert into access_type (id,access_type,access_value) values (3,NULL,'E'); /* fails because id  3 has been used */
 insert into access_type (id,access_type,access_value) values (4,NULL,'E')
> Affected rows: 1
> Time: 0.095s


insert into access_type (id,access_type,access_value) values (5,NULL,NULL)
> Affected rows: 1
> Time: 0.107s

您可能想查看 UNIQUE 的使用,因为您要强加一组非常严格的术语。猜测您可能希望将许多行作为 access_type 执行,并且您可能想要相同的 access_value。您可能不想要的是相同的 id 和 access_type 和/或相同的 access_value。

因此,您可能希望 ID 3 的访问类型为 exceute,而 ID 3 也有一行用于 noop 类型。然后,您可能需要一个复合 PRIMARY KEY 或 UNIQUE 索引。

例如,考虑以下改编:-

DROP TABLE IF EXISTS access_type;
CREATE TABLE IF NOT EXISTS access_type(
 id NUMBER NOT NULL /* PRIMARY KEY */ /* PRIMARY KEY IMPLIES UNIQUE */,
 access_type VARCHAR(10) /* UNIQUE */,
 access_value VARCHAR(2) /* UNIQUE */ , /*<<<<< added comma */
 PRIMARY KEY (id,access_type) /*<<<<< compound PRIMARY KEY */
 );
 insert into access_type (id,access_type,access_value) values (3,'execute',NULL);
 insert into access_type (id,access_type,access_value) values (3,'noop',NULL);
 insert into access_type (id,access_type,access_value) values (4,NULL,'E');
 insert into access_type (id,access_type,access_value) values (5,NULL,NULL); 

但是,如果 insert into access_type (id,access_type,access_value) values (3,'execute',NULL);尝试过,它就会失败。

您可能还想考虑 INSERT OR IGNORE 在这种情况下,UNIQUE 约束冲突将是 NOOP 而不是失败。


推荐阅读