Я пытаюсь перенести свое приложение с mySQL на SQLite, и для этого я воссоздал все свои таблицы mySQL в SQLite.
Я читал о том, что AUTOINCREMENT не рекомендуется использовать при объявлении фактического поля автоинкремента. И вместо этого я должен просто объявить свое поле автоинкремента как PRIMARY KEY NOT NULL, и SQLite будет автоматически увеличивать его. Все в порядке, кроме того, что он не работает или я не могу его использовать.
Я использую Delphi XE с Zeos и SQLite-3
Вот что я пробовал:
1.
dm.ZConnection1.Protocol := 'sqlite-3';
dm.ZConnection1.Database := 'myDB.s3db';
dm.ZConnection1.Connect;
dm.ZConnection1.ExecuteDirect('CREATE TABLE IF NOT EXISTS test ('+
' id int AUTOINC PRIMARY KEY,'+
' myval varchar(200) default NULL);');
dm.ZConnection1.ExecuteDirect('insert into test (myval) values (''first'')');
dm.ZConnection1.ExecuteDirect('insert into test (myval) values (''second'')');
dm.ZConnection1.ExecuteDirect('insert into test (myval) values (''third'')');
dm.ZConnection1.ExecuteDirect('insert into test (myval) values (''fourth'')');
Если я запустил приведенный выше код, моя таблица будет сгенерирована, но вставленные строки не имеют значений (я думаю, NULL) в поле идентификатора
а затем я попытался заменить AUTOINC на AUTOINCREMENT и получил синтаксическую ошибку при создании таблицы рядом с AUTOINCREMENT, поэтому я предполагаю, что ZEOS не поддерживает объявление AUTOINCREMENT?!?!
А потом я попробовал без AUTOINC, я просто объявил поле ID как
id int (11) ПЕРВИЧНЫЙ КЛЮЧ,
и мой код не выдает ошибок, за исключением того, что все значения поля ID пусты (автоинкрементация не производилась)
- Если я добавляю NOT NULL после PRIMARY KEY, мой код выдает ошибки, потому что я пытаюсь вставить нулевые значения в поле NOT NULL.
Итак, дайте мне знать, что именно я могу сделать для достижения того, что мне нужно, без необходимости вручную вычислять следующее значение идентификатора для каждой вставки. Это вообще возможно?
id INTEGER PRIMARY KEY
Отказаться отAUTOINCREMENT
обычно рекомендуется (если это действительно не нужно), потому что это предполагает сохранение максимального значения, когда-либо использовавшегося в таблице, что (немного) замедляет работу. - person TripeHound   schedule 18.09.2015PRIMARY KEY
имело желаемое поведение автогенерации, оно должно применяться кINTEGER
, а не к любому из его похожих по звучанию вариантов. - person TripeHound   schedule 18.09.2015