我有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})");
现在工作正常。
答案 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函数。
从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
它会继续自动增加。