Предотвратить автоинкрементный целочисленный первичный ключ?
У меня есть таблица sqlite (sqlite версии 3.7.3), где значения NULL, вставленные в столбец первичного ключа, нежелательно автоматически увеличиваются:
sqlite> CREATE TABLE foo(bar INTEGER NOT NULL PRIMARY KEY);
sqlite> INSERT INTO foo(bar) VALUES(NULL);
sqlite> SELECT * FROM foo;
1
В документации sqlite это показывает, что добавление AUTOINCREMENT
ключевое слово для столбца должно создавать такое поведение, но, похоже, не существует ключевого слова для предотвращения автоматического увеличения...
Я также обнаружил, что я могу построить sqlite с SQLITE_OMIT_AUTOINCREMENT
опция компиляции, но я не хочу отключать поведение глобально, только для этого конкретного столбца.
Интересно, если я не включу PRIMARY KEY
ограничение, я получаю желаемое поведение:
sqlite> CREATE TABLE FOO(bar integer NOT NULL);
sqlite> INSERT INTO FOO(bar) VALUES(NULL);
SQL error: foo.bar may not be NULL
Как я могу определить таблицу так, чтобы значения NULL были отклонены и сохранить ограничение первичного ключа?
2 ответа
Поведение автоинкремента применяется только к столбцам, объявленным как INTEGER PRIMARY KEY
, Так что самые простые способы отключить это:
- Объявите столбец как
UNIQUE
вместоPRIMARY KEY
, - Объявите тип столбца как
INT
вместоINTEGER
,
Обратите внимание, что любой из них даст вам столбец с целочисленным сродством, вместо того чтобы ограничиваться только целыми числами.
Один из способов отключить автоинкремент (вне пересоздания таблицы), когда вам нужно вставить данные, - использовать инструмент импорта в sqlite3:
Если у вас есть такая таблица:
CREATE TABLE [table1] ( [ID] integer PRIMARY KEY AUTOINCREMENT NOT NULL, [col1] TEXT);
Если вы запустите команду импорта с вашим файлом данных:
ID col1
10 abc
20 def
import myfile.txt table1
Он импортирует строки и не учитывает функцию автоинкремента.