尝试在 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 而不是失败。
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 而不是失败。