MySQL:在插入

时间:2016-11-29 02:10:18

标签: mysql

我正在设计一个评论MySQL db,我的评论表有字段:

  • id主键,auto-incr
  • thread int,not null
  • content

除了根评论之外,对同一评论的所有回复必须共享相同的thread。当用户回复评论时这很简单,但是当发布新的根评论时呢?我想我会为thread=id设置根评论。

问题是,在填写id时,我不知道如何编写将在同一查询中重用刚刚创建的thread的查询。这甚至可能吗?

我试过

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

这给了我前一个插入的id,而不是当前插入的id。我必须使用2个查询吗?

3 个答案:

答案 0 :(得分:3)

  

我必须使用2个查询吗?

是。如您所发现的那样,在BEFORE INSERT触发器中尚未生成id值。但是你不能在AFTER INSERT触发器中改变你的NEW.thread值。

您不能依赖于阅读INFORMATION_SCHEMA,因为您可能会导致竞争条件。

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

[num, txt, raw] = xlsread(filename,sheet,'FIRST_DATA')

如果是根评论。

另见我过去对类似主题的回答:

答案 1 :(得分:0)

感谢迈克尔的回答,我开始looking into triggers;基本上事件处理程序,当事情发生时运行一些代码。迈克尔的触发器对我不起作用,但以下是:

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帐户可以定义它。

感谢this answer获取灵感

答案 2 :(得分:-1)

您只需将thread设置为NULL即可表示评论是根评论,而不是附加到帖子。