[英]Any way to prevent AUTOINCREASE on failed 'INSERT OR IGNORE'?
問題摘要:對於MySQL和SQLite,在具有AUTOINCREMENT的表上INSERT OR IGNORE
失敗的INSERT OR IGNORE
仍會增加autoincremented值 。 這里討論了這個問題: INSERT IGNORE即使沒有添加記錄也會增加自動遞增計數器嗎?
我的問題:具有99%失敗插入的表最終會產生巨大的索引號,例如記錄1500的索引號為165200。
這是不切實際的,因此我正在尋找一種應對這種行為的方法。
由於INSERT OR IGNORE
應該與INSERT ON CONFLICT IGNORE
相同,因此我想到了在INSERT ON CONFLICT FAIL
或INSERT ON CONFLICT ABORT
。
我的問題是我以這種方式從SELECT
插入:
INSERT OR IGNORE INTO t1 (x,y,z,) SELECT * FROM t2
此語法不接受ON CONFLICT FAIL
。 這兩個都不起作用:
INSERT ON CONFLICT FAIL INTO t1 (x,y,z,) SELECT * FROM t2
INSERT INTO t1 (x,y,z,) SELECT * FROM t2 ON CONFLICT FAIL
有什么想法或提示嗎?
首先, on conflict
僅適用於sqlite,並在定義約束時使用(例如, ... primary key on conflict abort ...
)。 如果其中一行失敗, abort
將不會插入任何行。 fail
甚至更奇怪:如果您嘗試插入5行,而第三行由於鍵而失敗,它將插入前2行,然后停止。 簡而言之:不要使用它。 兩種版本都與ignore
(至少超過一排)。
插入多行時,基本上只有一種方法可以防止自動遞增:不要插入表中已經存在的行。
這樣做的通常方法是檢查該行是否存在,而不是on duplicate key
/ ignore
on duplicate key
的“惰性”。 例如,檢查y
列中的重復值:
INSERT INTO t1 (x,y,z)
SELECT * FROM t2 main
where not exists (
select * from t1 test
where main.y = test.y);
是的,我知道,這會使您的代碼更長。 您將不幸地不得不忍受這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.