Неоднозначное сообщение об ошибке при попытке вставить значение NULL для атрибута UNIQUE в таблицу - PullRequest
0 голосов
/ 11 ноября 2019

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

Случай I:

Когда я попытался вставить NULL для атрибута access_value, я получил вывод ниже:

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

Случай II:

Когда япопытался вставить NULL для атрибута access_type, я получил вывод ниже:

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

Я хочу знать, почему sqlite3 выдает ошибку для access_type , когда я вставляю NULL для access_value в первом случае и выдаёт ошибку для access_value при вставке NULL для access_type . Пожалуйста, помогите

1 Ответ

3 голосов
/ 11 ноября 2019

Случай 1 не завершился с ошибкой из-за NULL (NULL считается отличным от всех других NULL). Ошибка: из-за того, что в * 1005 уже была строка, в которой execute * access_type столбец.

то есть сообщения говорят вам, что УНИКАЛЬНЫМ контрастом, который не удался (был конфликт), был столбец access_type .

Случай2 также не удалось из-за другой строки, имеющей 3 в столбце id .

Возможно, рассмотрим следующее (обратите внимание на 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. То, что вы, возможно, не хотите, это тот же идентификатор и access_type и / или то же access_value.

Таким образом, вы можете захотеть, чтобы ID 3 имел тип доступа с исключением, а 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; в этом случае УНИКАЛЬНЫЙ конфликт ограничений будет NOOP, а не неудачей.

...