Sqlite3最大主键值

时间:2011-10-16 12:06:42

标签: php sqlite

我有INTEGER PRIMARY KEY的表,我不能插入大于2147483647的值作为键。是否有可能以某种方式增加这个值?

更新: 好的,我有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();
?>

我在测试数据库中得到的是:

root@localhost:~# 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中将大值插入sqlite数据库?

UPDATE2:

我已将foreach的身体改为:

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

现在工作正常。

2 个答案:

答案 0 :(得分: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无类型的一个例外是类型为的列   INTEGER PRIMARY KEY。 (你必须使用“INTEGER”而不是“INT”。一列   INT PRIMARY KEY类型与其他类型一样无类型。)INTEGER   PRIMARY KEY列必须包含32位有符号整数。任何尝试   插入非整数数据将导致错误。

     

INTEGER PRIMARY KEY列可用于实现等效的   自动递增。如果您尝试将NULL插入INTEGER PRIMARY KEY   在列中,该列实际上将填充一个整数   大于表中已有的最大密钥。或者如果最大的   键是2147483647,然后该列将随机填充   整数。无论哪种方式,INTEGER PRIMARY KEY列都将被分配一个   唯一整数。您可以使用。检索此整数   sqlite_last_insert_rowid()API函数或使用   last_insert_rowid()后续SELECT语句中的SQL函数。

source

从SQLite版本3支持2,4,6或8字节的整数,行ID在64位。

因此,如果您的版本低于3,则答案是,不,您无法做任何事情。

答案 1 :(得分:1)

我从未见过SQLite3的那种行为。修改您的问题,然后粘贴.schema your-table-name的输出。另外,请确保问题不在您的应用程序代码中。

Declaring a column as integer in SQLite的工作方式与在真正的SQL dbms中将列声明为整数的方式不同。在SQLite3中,任何声明为INTEGER PRIMARY KEY的列都应该接受任何64位有符号整数。 64位整数max最大为1.84467441×10 19 。 (你的专栏也应该接受负整数。)

  

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 33 范围内的值。

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

它会继续自动增加。