2011-10-16 41 views
0

我有INTEGER PRIMARY KEY表,我不能插入大於2147483647作爲關鍵的值。有沒有可能以某種方式增加這個值?Sqlite3最大主鍵值

UPDATE: 好吧,我有一個PHP腳本:

<?php 

$sqlite_db = new SQLite3('test'); 
$sqlite_db->exec('CREATE TABLE test (n UNSIGNED INTEGER)'); 

$ns = array(1111111111,2222222222,3333333333,4444444444,5555555555,6666666666,7777777777); 

foreach ($ns as $n) 
{ 
    $statement = $sqlite_db->prepare('INSERT INTO test (n) VALUES (:n)'); 
    $statement->bindValue(':n', $n, SQLITE3_INTEGER); 
    $statement->execute(); 
} 

$sqlite_db->close(); 
?> 

和我所得到的測試數據庫是:

[email protected]:~# sqlite3 test 
SQLite version 3.7.3 
Enter ".help" for instructions 
Enter SQL statements terminated with a ";" 
sqlite> select * from test; 
1111111111 
-2072745074 
-961633963 
149477148 
1260588259 
-1923267926 
-812156815 

所以我的問題是:如何將大的值到源碼數據庫從PHP?

UPDATE2:

我已經改變了的foreach身體:

$sqlite_db->exec("INSERT INTO test (n) VALUES ({$n})"); 

,現在工程確定。

回答

0

我從來沒有見過與SQLite3的行爲。編輯你的問題,並粘貼.schema your-table-name的輸出。另外,請確保問題不在您的應用程序代碼中。

Declaring a column as integer in SQLite的工作方式與在真正的SQL dbms中將整列聲明爲不同。在SQLite3中,任何聲明爲INTEGER PRIMARY KEY的列都應該接受任何64位有符號整數。 64位整數最大爲1.84467441×10 。 (您的專欄也應該接受負整數。)

INTEGER。該值是一個有符號整數,根據值的大小存儲在1,2,3,4,6或8個字節中。

sqlite> create table t (n integer primary key, s varchar(35)); 
sqlite> insert into t (s) values ('a'); 
sqlite> insert into t (s) values ('a'); 
sqlite> insert into t (s) values ('a'); 
sqlite> select * from t; 
1|a 
2|a 
3|a 

所以,它會自動遞增。 。 。

sqlite> insert into t values (2147483647, 'a'); 
sqlite> select * from t; 
1|a 
2|a 
3|a 
2147483647|a 

它接受一個32位有符號整數的最大值。

sqlite> insert into t (s) values ('a'); 
sqlite> insert into t (s) values ('a'); 
sqlite> insert into t (s) values ('a'); 
sqlite> select * from t; 
1|a 
2|a 
3|a 
2147483647|a 
2147483648|a 
2147483649|a 
2147483650|a 

而且它增加過去的32位有符號整數的最大值。

sqlite> insert into t values (8589934592, 'a'); 
sqlite> select * from t; 
1|a 
2|a 
3|a 
2147483647|a 
2147483648|a 
2147483649|a 
2147483650|a 
8589934592|a 

它接受在2 範圍內的值。

sqlite> insert into t (s) values ('a'); 
sqlite> select * from t; 
1|a 
2|a 
3|a 
2147483647|a 
2147483648|a 
2147483649|a 
2147483650|a 
8589934592|a 
8589934593|a 

並繼續自動遞增。

1

2147483647是整數的最大值,這意味着更大的數字將不適合它,因爲沒有空間。

整數通常使用4個字節(32位)表示,其中最後一位是唱歌。

31     15    0 
    0000 0000 0000 0000 0000 0000 0000 0000 = 0 

    0111 1111 1111 1111 1111 1111 1111 1111 = +2147483647 

    1111 1111 1111 1111 1111 1111 1111 1111 = -2147483647 

從文檔:

一個例外的SQLite的typelessness是其類型是 INTEGER PRIMARY KEY的列。 (並且必須使用「INTEGER」而不是「INT」。INT PRIMARY KEY類型的列 與其他任何類型一樣是無類型的。)INTEGER PRIMARY KEY列必須包含32位有符號整數。任何嘗試 插入非整數數據都會導致錯誤。

INTEGER PRIMARY KEY列可用於實現等效於 AUTOINCREMENT。如果嘗試將NULL插入到INTEGER PRIMARY KEY列中,則實際上該列將填充的整數大於表中已有的最大鍵的一個 。或者如果最大的 鍵是2147483647,那麼該列將填充隨機的 整數。無論如何,INTEGER PRIMARY KEY列將被分配一個 唯一整數。您可以在後續SELECT語句中使用 sqlite_last_insert_rowid()API函數或使用last_insert_rowid()SQL函數檢索此整數。

source

從SQLite的版本3支持在2,4,6或8個字節的整數,行ID是64位。

所以,如果你的版本低於3,那麼答案是,不,你不能做任何事情。

+0

大拇指指出Sqlite3的變化。參考是[這裏](http://www.sqlite.org/version3.html) – KudoCC