如何创建我的数字匹配表填充从零而不是一个?

时间:2010-10-27 14:28:23

标签: sql sqlite

我正在使用数字匹配表,从一个向上。但是,我意识到我需要从零开始。无法弄清楚..

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 个答案:

答案 0 :(得分:1)

在sql server中,如果你像这样创建你的表

就很容易了
CREATE TABLE util_nums (n as int primary key 
    identity(0,1) not null,anotherfieldtoholdthenulls integer);

identity(0,1)表示从零开始并递增1 ..

<强>更新

在开始插入之前尝试使用UPDATE SQLITE_SEQUENCE SET seq = -1 WHERE name = 'util_nums',看看是否允许....

您还应该能够INSERT INTO util_nums VALUES(0)

答案 1 :(得分:0)

您可以使用

暂时禁用自动增量
 SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';

但我建议在插入

后将值更新为0

答案 2 :(得分:0)

"SQLite Autoincrement"

重要的部分似乎是......

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

所以?创建表,插入虚拟记录,强制ID为-1,然后插入数据。之后删除虚拟记录,如果需要的话。

(插入一个带-1的值将强制下一个插入的rwo的id为0,假设该表为空。)

答案 3 :(得分:0)

如果你正在使用SQLite,你应该阅读这个http://www.sqlite.org/autoinc.html。这引起了我的注意:

  

如果表从未有过   包含任何数据,然后ROWID为1   使用。

似乎没有任何方法可以强制自动增量从1以外的其他东西开始。另请注意,它可能会通过跳过数字来产生间隙。


可能有效但我目前无法进行测试:
添加ID为-1的行。然后删除它。从文档中不清楚当表中只有负ID时会发生什么。

答案 4 :(得分:0)

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;

答案 5 :(得分:0)

SQLite允许您在此处指定值。

只需从笛卡尔积中插入c.n - 1,而不是null,并将其称为一天。