我想將我的應用程序從mySQL遷移到SQLite,爲了做到這一點,我在SQLite中重新創建了所有mySQL表。德爾福SQLite插入到一個表中,主鍵爲自動增量
我讀了關於AUTOINCREMENT不推薦用於聲明實際自動增量字段的事實。而不是我應該只聲明我的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'')');
如果我運行上面的代碼,獲取生成我的表,但插入的行在ID字段中沒有值(我猜爲空)
然後我嘗試用AUTOINC替換AUTOINC REMENT和創建AUTOINCREMENT附近的表時出現語法錯誤,所以我假設ZEOS不支持AUTOINCREMENT的聲明?!?!
然後我嘗試沒有AUTOINC,我剛剛宣佈ID字段作爲
ID INT(11)PRIMARY KEY,除了值
和我的代碼不給我的錯誤ID字段都是空的(沒有自動增加)
- 如果我在PRIMARY KEY之後添加NOT NULL,那麼我的代碼會給我錯誤,因爲我試圖在NOT中插入空值NULL字段
所以,請讓我知道我能做些什麼來實現我所需要的,而不必手動計算每個插頁上的下一個id值。它甚至有可能嗎?
我想你想'id INTEGER PRIMARY KEY'通常建議不要使用'AUTOINCREMENT'(除非確實需要),因爲它涉及在表中保留「曾使用過的最大值」,這會稍微放慢速度。 – TripeHound
顯然我應該使用INTEGER而不是INT來聲明id字段。我只需要運行幾個測試,然後回到這裏... – user1137313
SQLite接受了很多變體,用於定義一個字段的方式(與其他SQL方言儘可能「不是不兼容」),但很多時候它們都是「幾乎不相關,因爲任何字段都可以保存任何類型的值。少數例外之一是,對於'PRIMARY KEY'字段來說,您需要自動生成行爲,它需要應用於'INTEGER',而不是任何類似的聲音變體。 – TripeHound