sqlite - 尝试在表中插入 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提供错误。请帮忙
解决方案
案例 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 而不是失败。
推荐阅读
- php - 将服务器 php 版本从 5.5 更改为 5.6 时,无法从 Codeigniter 2.2.6 的根文件夹中获取 .css 文件
- c++ - increment a number based on condition
- bash - How to create array of functions from command line in bash?
- jenkins - circleCI 可以像 Jenkins 一样防止错误的提交登陆 master 吗?
- php - AMPPS 域面板添加域名错误
- javascript - JavaScript AJAX,xmlHttpRequest 在单独的类中
- javascript - react-native 中的图像压缩
- android - 如何将base64的图像从数据库插入到recycleView
- css - 如何让 zurb 基础单元格中的 DIV 中的元素在新行中开始
- javascript - 我如何获得数组 indexOf 元素包含值