尝试在 table 中为 UNIQUE 属性插入 NULL 值时出现不明确的错误消息

Ambiguous error message when trying to insert NULL value for UNIQUE attribute in a table


 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

我想知道为什么当我为 access_value[=28= 插入 NULL 时,sqlite3 为 access_type 报错] 在第一种情况下,当为 access_type 插入 NULL 时,access_value 出错。请帮助

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

即消息告诉您失败(冲突)的 UNIQUE 约束是 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 and/or 相同的 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); 被尝试过,那么它将失败。

您可能还想考虑插入或忽略,在这种情况下,唯一约束冲突将是 NOOP 而不是失败。