2015-09-18 87 views
1

我想將我的應用程序從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字段中沒有值(我猜爲空)

  1. 然後我嘗試用AUTOINC替換AUTOINC REMENT和創建AUTOINCREMENT附近的表時出現語法錯誤,所以我假設ZEOS不支持AUTOINCREMENT的聲明?!?!

  2. 然後我嘗試沒有AUTOINC,我剛剛宣佈ID字段作爲

    ID INT(11)PRIMARY KEY,除了值

和我的代碼不給我的錯誤ID字段都是空的(沒有自動增加)

  1. 如果我在PRIMARY KEY之後添加NOT NULL,那麼我的代碼會給我錯誤,因爲我試圖在NOT中插入空值NULL字段

所以,請讓我知道我能做些什麼來實現我所需要的,而不必手動計算每個插頁上的下一個id值。它甚至有可能嗎?

+0

我想你想'id INTEGER PRIMARY KEY'通常建議不要使用'AUTOINCREMENT'(除非確實需要),因爲它涉及在表中保留「曾使用過的最大值」,這會稍微放慢速度。 – TripeHound

+0

顯然我應該使用INTEGER而不是INT來聲明id字段。我只需要運行幾個測試,然後回到這裏... – user1137313

+0

SQLite接受了很多變體,用於定義一個字段的方式(與其他SQL方言儘可能「不是不兼容」),但很多時候它們都是「幾乎不相關,因爲任何字段都可以保存任何類型的值。少數例外之一是,對於'PRIMARY KEY'字段來說,您需要自動生成行爲,它需要應用於'INTEGER',而不是任何類似的聲音變體。 – TripeHound

回答

0

Some other part of the documentation說:

的主鍵列只有在聲明的類型名稱正是「整數」成了一個整數主鍵。其他整數類型名稱,如「INT」或「BIGINT」或「SHORT INTEGER」或「UNSIGNED INTEGER」會導致主鍵列的行爲與普通表列相同...