當我在SQLite數據庫中創建表時,會爲每個表自動創建單獨的序列。如何在sqlite中爲所有表使用一個序列
不過,我想用一個序列在我的SQLite數據庫中的所有表,也需要設置序列min
和max
值(例如min=10000
和max=999999
)(min
和max
手段啓動順序和最高值序列的價值可以遞增)。
我知道這可以在Oracle數據庫中完成,但不知道如何在SQLite中完成。
有沒有辦法做到這一點?
當我在SQLite數據庫中創建表時,會爲每個表自動創建單獨的序列。如何在sqlite中爲所有表使用一個序列
不過,我想用一個序列在我的SQLite數據庫中的所有表,也需要設置序列min
和max
值(例如min=10000
和max=999999
)(min
和max
手段啓動順序和最高值序列的價值可以遞增)。
我知道這可以在Oracle數據庫中完成,但不知道如何在SQLite中完成。
有沒有辦法做到這一點?
不幸的是,你不能這樣做:SQLite自動爲特殊sqlite_sequence
服務表中的每個表創建序列。
即使您以某種方式強制它將單個序列作爲所有表格的源代碼,它也不會如您所期望的那樣工作。例如,在PostgreSQL或Oracle中,如果將序列設置爲值1
,但表格已經填充了值爲1
,2
,...的行,則嘗試使用該序列作爲源插入新行將失敗,並出現唯一約束違規。
在SQLite的,但是,如果手動使用類似復位序列:
UPDATE sqlite_sequence SET seq = 1 WHERE name = 'mytable'
,你已經有行1
,2
,3
,...,新的嘗試插入不會失敗,但自動將該序列的最大現有值分配給相應的自動增量列,以便它可以繼續上升。
請注意,您可以使用此hack爲序列分配起始值,但不能使其停止遞增(除非您使用其他方式觀看)。
如果使用自動增加重複項的列不會發生,因爲下次您將使用該序列時,SQLite將生成表中最大值的數字+1。 我不確定這是否僅適用於列爲主鍵或有一個唯一的約束,但這通常是自動增量列的情況。 – RobMcZag 2016-01-22 16:55:13
@RobMcZag:這正是我所說的 - 在SQLite中,如果表中已經存在當前值,那麼序列將被自動分配到下一個possilble值。目前的算法是最大+ 1 – mvp 2016-01-22 18:25:45
是的,但試圖推廣。在你的例子中,你設置序列爲1,但你的行中有id = 1。我試圖指出,在SQLite中,無論如何,即使將序列設置爲不在表中的數字,並且可以認爲可用,也會得到最大值+1。 – RobMcZag 2016-01-25 18:53:55
首先,這是一個壞主意。
數據庫查詢的性能取決於可預測性,並且通過擺脫引入偏移量的索引序列來擺脫數據庫引擎的困擾。
然而,要實現這一點,你可以嘗試以確定最低序列號是高於或等於任何現有的序列號:
SELECT MAX(seq) FROM sqlite_sequence
這需要每一個INSERT查詢之後進行,接着是所有表的所有序列的更新:
UPDATE sqlite_sequence SET seq=determined_max
@muistooshort我一直在使用'SQLite數據庫Browser'檢查SQLite數據庫。在我的數據庫中的所有表的'sqlite_sequence'表中有單獨的不同序列。 – Bishan 2013-02-27 09:16:43