2013-02-27 57 views
4

當我在SQLite數據庫中創建表時,會爲每個表自動創建單獨的序列。如何在sqlite中爲所有表使用一個序列

不過,我想用一個序列在我的SQLite數據庫中的所有表,也需要設置序列minmax值(例如min=10000max=999999)(minmax手段啓動順序和最高值序列的價值可以遞增)。

我知道這可以在Oracle數據庫中完成,但不知道如何在SQLite中完成。

有沒有辦法做到這一點?

+1

@muistooshort我一直在使用'SQLite數據庫Browser'檢查SQLite數據庫。在我的數據庫中的所有表的'sqlite_sequence'表中有單獨的不同序列。 – Bishan 2013-02-27 09:16:43

回答

4

不幸的是,你不能這樣做:SQLite自動爲特殊sqlite_sequence服務表中的每個表創建序列。

即使您以某種方式強制它將單個序列作爲所有表格的源代碼,它也不會如您所期望的那樣工作。例如,在PostgreSQL或Oracle中,如果將序列設置爲值1,但表格已經填充了值爲1,2,...的行,則嘗試使用該序列作爲源插入新行將失敗,並出現唯一約束違規。

在SQLite的,但是,如果手動使用類似復位序列:

UPDATE sqlite_sequence SET seq = 1 WHERE name = 'mytable' 

,你已經有行123,...,新的嘗試插入不會失敗,但自動將該序列的最大現有值分配給相應的自動增量列,以便它可以繼續上升。

請注意,您可以使用此hack爲序列分配起始值,但不能使其停止遞增(除非您使用其他方式觀看)。

+0

如果使用自動增加重複項的列不會發生,因爲下次您將使用該序列時,SQLite將生成表中最大值的數字+1。 我不確定這是否僅適用於列爲主鍵或有一個唯一的約束,但這通常是自動增量列的情況。 – RobMcZag 2016-01-22 16:55:13

+0

@RobMcZag:這正是我所說的 - 在SQLite中,如果表中已經存在當前值,那麼序列將被自動分配到下一個possilble值。目前的算法是最大+ 1 – mvp 2016-01-22 18:25:45

+0

是的,但試圖推廣。在你的例子中,你設置序列爲1,但你的行中有id = 1。我試圖指出,在SQLite中,無論如何,即使將序列設置爲不在表中的數字,並且可以認爲可用,也會得到最大值+1。 – RobMcZag 2016-01-25 18:53:55

0

首先,這是一個壞主意。

數據庫查詢的性能取決於可預測性,並且通過擺脫引入偏移量的索引序列來擺脫數據庫引擎的困擾。

然而,要實現這一點,你可以嘗試以確定最低序列號是高於或等於任何現有的序列號:

SELECT MAX(seq) FROM sqlite_sequence 

這需要每一個INSERT查詢之後進行,接着是所有表的所有序列的更新:

UPDATE sqlite_sequence SET seq=determined_max