簡體   English   中英

有什么方法可以防止失敗的“ INSERT OR IGNORE”上的AUTOINCREASE?

[英]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 FAILINSERT 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM