DBD :: SQLite :: st выполнить не удалось: идентификатор не может быть NULL - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь вставить строку с использованием Perl в таблицу из базы данных SQLite.В таблице есть столбец ID с установленными свойствами AUTOINCREMENT и PRIMARY KEY.

Из схемы MY_TABLE это вся информация относительно поля ID:

ID [INT AUTO_INCREMENT] NOT NULL,
PRIMARY KEY (ID)

Я не хочу настраивать ID для каждой новой добавленной строки, поэтому я попробовал несколько способов разрешить базе данных обновлять ее сам, но я получаю:

DBD:: SQLite :: st выполнить не удалось: MY_TABLE.ID не может быть NULL

use DBI;
my $db = DBI->connect("...");
my $sql = qq{
    insert into MY_TABLE (ID, col_b, col_c, col_d)
    values(?, ?, ?, ?)
}

my $st = $db->prepare($sql);
$st->execute(undef, 'val2', 'val3', 'val4');

Я также попытался полностью пропустить параметр из запроса и из параметров, но с теми же результатами.Помещение 0 вместо undef вставляет фактическое значение (которое я не хочу, я хочу увеличивать автоматически).

Чего мне не хватает?

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Как уже упоминалось, правильное написание - это AUTOINCREMENT, а не AUTO_INCREMENT, но не обращайте на это внимания, вам действительно нужно объявить свое поле идентификатора INTEGER PRIMARY KEY, точно , как это, INT isnнедостаточно, и вам все равно обычно не нужно ключевое слово AUTOINCREMENT (см. https://sqlite.org/lang_createtable.html), и не указывайте ничего для идентификатора в вашей INSERT статистике.

0 голосов
/ 13 февраля 2019
ID [INT AUTO_INCREMENT] NOT NULL,
PRIMARY KEY (ID)
  1. AUTOINCREMENT (не AUTO_INCREMEMENT) работает только со столбцом INTEGER PRIMARY KEY (и обычно его не следует использовать, так как он не выполняет то, что следует из названия; детали).
  2. Большинство таблиц sqlite имеют первичный ключ, представляющий собой 64-разрядное целое число со знаком ( rowid ).При вставке новой строки, если значение rowid отсутствует или NULL, новое генерируется автоматически (это то, что люди думают AUTOINCREMENT, потому что они привыкли к тому, как работают другие базы данных),Столбец INTEGER PRIMARY KEY действует как псевдоним для rowid и ведет себя так же.Любой другой первичный ключ эквивалентен уникальному индексу для этого столбца (столбцов).Сходство столбца должно быть INTEGER для псевдонима rowid.Ничего другого, как INT. Дополнительная литература .

Таким образом, в основном измените определение таблицы, включив вместо него

id INTEGER PRIMARY KEY

, и вы можете оставить его вне INSERT илиприсвойте ему NULL, и он будет работать так, как вы хотите.

0 голосов
/ 13 февраля 2019

Я подозреваю, что вы не должны передавать пустое значение столбцу, а вместо этого не передавать сам столбец.

Попробуйте:

use DBI;
my $db = DBI->connect("...");
my $sql = qq{
    insert into MY_TABLE (col_b, col_c, col_d)
    values(?, ?, ?)
}

my $st = $db->prepare($sql);
$st->execute('val2', 'val3', 'val4');
...