Как я могу создать свою таблицу соответствия чисел с нуля вместо одного? - PullRequest
0 голосов
/ 27 октября 2010

Я использую таблицу сопоставления чисел, от одного вверх.Однако я понимаю, что нужно начинать с нуля.Не могу понять ..

CREATE TABLE IF NOT EXISTS util_nums (n integer primary key 
    autoincrement not null);

insert into util_nums(n) select null from (select 0 as n union select 1 
union select 2 union select 3 union select 4 union select 5 union select 6 
union select 7 union select 8 union select 9 union select 10) a 
    cross join 
(select 0 as n union select 1 union select 2 union select 3 union select 4 
union select 5 union select 6 union select 7 union select 8 union select 9 
union select 10) b 
    cross join (select 0 as n union select 1 union select 2 
union select 3 union select 4 union select 5 union select 6 union select 7 
union select 8 union select 9 union select 10) c;

Ответы [ 6 ]

1 голос
/ 27 октября 2010

на сервере sql было бы легко, если бы вы создали свою таблицу следующим образом

CREATE TABLE util_nums (n as int primary key 
    identity(0,1) not null,anotherfieldtoholdthenulls integer);

identity(0,1) означает, что начинать с нуля и увеличивать на 1 ..

update

попробуйте использовать UPDATE SQLITE_SEQUENCE SET seq = -1 WHERE name = 'util_nums' перед запуском вставки и посмотрите, разрешено ли это ...

Вы также можете сделать INSERT INTO util_nums VALUES(0)

0 голосов
/ 22 ноября 2013

SQLite позволяет указать здесь значение.

Просто вставьте c.n - 1 из вашего декартового произведения вместо нуля и назовите его в день.

0 голосов
/ 27 октября 2010

Sqlite позволяет вставлять явные значения для полей первичного ключа:

insert into util_nums(n) values (0);

, чтобы получить намного больше строк для быстрой вставки. Попробуйте это после этого ..

insert into util_nums default values;
insert into util_nums(n) select null from util_nums a, util_nums b, util_nums c, util_nums d;
insert into util_nums(n) select null from util_nums a, util_nums b, util_nums c, util_nums d;
0 голосов
/ 27 октября 2010

Если вы используете SQLite, вам, вероятно, следует прочитать это http://www.sqlite.org/autoinc.html.Это привлекло мое внимание:

Если в таблице никогда ранее не было никаких данных, то используется ROWID, равный 1.

Это, похоже, никакзаставить автоинкремент начинать с чего-то другого, кроме 1. Также обратите внимание, что при пропуске чисел могут возникать пробелы.


Это может работать, но у меня нет средств для тестирования в данный момент:
Добавить строку с идентификатором -1.Затем удалите его. Из документации не ясно, что происходит, когда в таблице есть только отрицательные идентификаторы.

0 голосов
/ 27 октября 2010

"Автоинкремент SQLite"

Важная часть, кажется, ...

If no negative ROWID values are inserted explicitly, then automatically
generated ROWID values will always be greater than zero.

Так? Создайте таблицу, вставьте фиктивную запись с принудительным идентификатором -1, а затем вставьте свои данные. Удаление фиктивной записи впоследствии как / при необходимости.

(Вставка значения с -1 заставит следующий вставленный rwo иметь идентификатор 0, при условии, что в противном случае таблица будет пустой.)

0 голосов
/ 27 октября 2010

Вы можете временно отключить автоматическое увеличение с помощью

 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

Но я предложите обновить значение до 0 после вставки

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