Sqlite3 максимальное значение первичного ключа - PullRequest
0 голосов
/ 16 октября 2011

У меня есть таблица с 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

Итак, мой вопрос: как вставить большие значения в базу данных sqlite из php?

UPDATE2:

Я изменил тело foreach на:

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

и этотеперь работает нормально.

Ответы [ 2 ]

1 голос
/ 16 октября 2011

Я никогда не видел такого поведения с SQLite3.Отредактируйте свой вопрос и вставьте вывод .schema your-table-name.Кроме того, убедитесь, что проблема не в коде вашего приложения.

Объявление столбца как целого в SQLite работает иначе, чем объявление столбца как целого в истинном дБм SQL.В SQLite3 любой столбец, объявленный INTEGER PRIMARY KEY, должен принимать любое 64-разрядное целое число со знаком.Максимальное число 64-битных чисел - 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

И продолжает автоматически увеличивать.

1 голос
/ 16 октября 2011

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 могут использоваться для реализации эквивалента AUTOINCREMENT.Если вы попытаетесь вставить NULL в столбец INTEGER PRIMARY KEY, столбец будет фактически заполнен целым числом, которое на единицу больше, чем самый большой ключ в таблице.Или, если самый большой ключ - 2147483647, столбец будет заполнен случайным целым числом.В любом случае столбцу INTEGER PRIMARY KEY будет присвоено уникальное целое число.Вы можете получить это целое число с помощью API-функции sqlite_last_insert_rowid () или с помощью SQL-функции last_insert_rowid () в следующем операторе SELECT.

source

From Version3 из SQLite поддерживает целые числа в 2,4,6 или 8 байтов, а идентификатор строки - в 64 битах.

Так что, если у вас версия меньше 3, ответ - нет, вы ничего не можете с этим поделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...