Будет ли AutoIncrement работать с проверочными ограничениями?
Вопрос прост: в SQLite, если я выберу автоинкремент, первичный ключ типа NUMERIC
который имеет ограничение проверки как CHECK(LENGTH(ID) == 10)
Будет ли работать правильно, если ввести первое значение как 0000000001 и так далее?
3 ответа
Если вы хотите ограничить значение столбца автоинкремента таким образом, вам нужно заполнить внутреннюю таблицу последовательности. (Есть и другие способы.)
create table foo (
foo_id integer primary key autoincrement,
other_columns char(1) default 'x',
check (length(foo_id) = 10 )
);
insert into sqlite_sequence values ('foo', 999999999);
Прикладному коду разрешено изменять таблицу sqlite_sequence, добавлять новые строки, удалять строки или изменять существующие строки.
insert into foo (other_columns) values ('a');
select * from foo;
1000000000|
Попытка вставить 11 цифр приводит к сбою ограничения CHECK.
insert into foo values (12345678901, 'a');
Ошибка: ограничение CHECK не выполнено: foo
Один из вариантов - вставить "поддельную" строку с первым действительным идентификатором сразу после создания таблицы. Затем удалите его.
create table foo(...);
insert into foo values (1000000000, 'a');
delete from foo;
Теперь вы можете вставить нормально.
insert into foo (other_columns) values ('b');
select * from foo;
1000000001 | б
Нет, это не работает. Добавление чека волшебным образом также не добавляет способа полного заполнения чека для вставки данных.
Смотрите этот SQLFiddle.
На самом деле длина идентификатора равна 1, поэтому он не работает.