2010-10-27 73 views
0

我使用一個數字匹配表,從一個向上。但是,我意識到我需要從零開始。不能圖了..如何創建我的數字匹配表從零填充而不是一個?

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; 
+0

你想做什麼?目前尚不清楚。 – egrunin 2010-10-27 14:33:10

+0

您的查詢試圖將1331'nulls'添加到非空字段中,該字段也是自動遞增的...註定在sql server中失敗..您使用的是什麼環境? – 2010-10-27 14:35:07

+0

這是MySQL還是其他一些RDBMS?如果你想知道語法,知道它是相當重要的... – MatBailie 2010-10-27 14:39:42

回答

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; 
+0

感謝這回答我的問題,但它比我的插入查詢少於1秒,3秒更慢,3秒,羞愧,本來會更好,有更多的價值。 – Jules 2010-10-27 15:03:54

+0

如果你在交易中做到這一點,速度會更快;)礦最終有104,994個數字,你的數字是1,331。你需要多少人才是真正的問題 – 2010-10-28 06:09:14

0

您可以使用

SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; 

即暫時禁用自動遞增,但插入後我 建議更新值到0

+0

我需要使用查詢,我不認爲我可以使用SET與sqlite。 – Jules 2010-10-27 14:42:08

0

"SQLite Autoincrement"

重要部分似乎是...

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

那麼,創建表格,插入一個虛擬記錄,強制ID爲-1,然後插入數據。之後刪除虛擬記錄,如有必要。

在SQL Server(插入值與-1將迫使下一插入RWO有0的ID,假設該表是空的,否則)

1

如果在你創建表這樣它會很容易

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)

0

如果你期運用SQLite的你應該閱讀本http://www.sqlite.org/autoinc.html。這引起了我的眼睛:

如果表中有 包含的任何數據,則使用1 一個ROWID是前所未有的。

它似乎沒有任何辦法強制自動增量從非1開始。另外請注意,它可能會通過跳過數字而產生間隙。


可能工作,但我目前沒有檢測手段:
添加一行-1的ID。然後刪除它。從文檔中不清楚當您在表中只有否定ID時會發生什麼情況。

0

SQLite允許你在這裏指定一個值。

只需從您的笛卡爾產品插入c.n - 1,而不是null,然後在一天內調用它。

相關問題