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