Предотвратить автоинкрементный целочисленный первичный ключ?

У меня есть таблица 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

Он импортирует строки и не учитывает функцию автоинкремента.

Другие вопросы по тегам