Случай 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, а не неудачей.