Mariadb

MariaDB 在更新時自動遞增

  • April 17, 2018

我有一個奇怪的問題,我找不到錯誤。我有一個 4 行的 MariaDB 表

[id] [clientid] [lastcheck] [Version]

id 欄位設置為 AutoIncrement。我的腳本在添加和更新值時一切正常

INSERT INTO $dbtable_update
   (clientid, lastcheck, currentversion)
VALUES
   ('$clientid', '$lastcheck', '$currentversion')
ON DUPLICATE KEY UPDATE
   lastcheck = '$lastcheck',
   currentversion = '$currentversion'

但是,一旦我更新現有條目的值,AutoIncement 就會計算 id 行。有人可以幫助我嗎,我做錯了什麼?

注意(來自評論):有UNIQUE(clientid).

以下假設您認為id序列中的間隙是一個問題。這通常不是問題,除非這些差距變得巨大並且有可能在某些時候超過最大值id

我將進一步假設該表的定義類似於:

CREATE TABLE clients(
 id int unsigned AUTO_INCREMENT, 
 clientid varchar(30) UNIQUE NOT NULL, 
 lastcheck datetime, 
 version varchar(10), 
 PRIMARY KEY (id)
);

如果您INSERT ... ON DUPLICATE KEY UPDATE對該表執行一條語句,那麼該id列將在每次嘗試INSERT第一次後增加,然後如果失敗,它會執行UPDATE.

為避免這種情況,您可以SELECT先對錶執行 a 以查看是否clientid存在,然後根據結果執行 anINSERT或 an 。UPDATE

但是,如果您有這樣的表:

CREATE TABLE clients (
 clientid varchar(30) NOT NULL, 
 lastcheck datetime, 
 version varchar(10),
 createtime datetime NOT NULL DEFAULT current_timestamp(),
 PRIMARY KEY (clientid)
);

…那麼您可以使用與INSERT ... ON DUPLICATE KEY以前相同的語句。無需id擔心列,clientid它將是唯一的(因為它是主鍵),並且可以從新createtime列中看到序列(這可能單獨有用)。

您可以使用類似於以下的語句更改目前表以獲取新表:

ALTER TABLE clients 
 DROP PRIMARY KEY, 
 DROP id, 
 ADD PRIMARY KEY (clientid), 
 ADD COLUMN createtime datetime NOT NULL DEFAULT current_timestamp();   

(但是請注意,createtime當您執行 時,現有記錄的所有 s 都將設置為目前時間戳ALTER。)

引用自:https://dba.stackexchange.com/questions/202768