我正在设计一个评论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个查询吗?
答案 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
即可表示评论是根评论,而不是附加到帖子。