簡體   English   中英

MySQL:在插入期間重用自動增量

[英]MySQL: re-use auto-increment during insert

我正在設計一個評論 MySQL 數據庫,我的評論表有字段:

  • id主鍵,自動遞增
  • thread int,不為空
  • content

所有對同一評論的回復,除了該根評論必須共享同一thread 當用戶回復評論時這很簡單,但是當發布新的根評論時呢? 我想我會為根評論設置thread=id

問題是,我不知道如何編寫一個查詢,以便在填充thread在同一個查詢中重用剛剛創建的id值。 這甚至可能嗎?

我試過了

INSERT INTO `comments`
VALUES (NULL, LAST_INSERT_ID(), 'hi there')

這給了我上一個插入的 id,而不是當前的。 我必須使用 2 個查詢嗎?

我必須使用 2 個查詢嗎?

是的。 正如您所發現的,尚未在 BEFORE INSERT 觸發器中生成 id 值。 但是您不能在 AFTER INSERT 觸發器中更改 NEW.thread 值。

您不能依賴閱讀 INFORMATION_SCHEMA,因為您可能會導致競爭條件。

您只需執行 INSERT,然后立即執行:

UPDATE comments SET thread=id WHERE id=LAST_INSERT_ID() AND thread IS NULL;

如果是根評論。

另請參閱我過去對類似主題的回答:

感謝邁克爾的回答,我開始 研究觸發器 基本上是在發生某些事情時運行一些代碼的事件處理程序。 邁克爾的觸發器對我不起作用,但以下是:

USE `my_db_name`;
DELIMITER $$
CREATE TRIGGER comments_bi 
BEFORE INSERT ON `comments`
FOR EACH ROW
BEGIN
  DECLARE nextID INT DEFAULT 0;

  SELECT AUTO_INCREMENT INTO nextID FROM information_schema.tables
  WHERE table_name = 'comments' AND table_schema = DATABASE();

  IF NEW.`thread` IS NULL OR NEW.`thread` = 0 THEN
    SET NEW.`thread` = nextID;
  END IF;

END $$
DELIMITER ;

一個重要的警告:因為這個觸發器需要訪問information_schema ,所以只有root帳戶可以定義它。

感謝這個答案的靈感

您可以簡單地將thread設置為NULL以表示注釋是根注釋而不是附加到線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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