我有一个包含此内容的触发器:
SET v1 = CONCAT_WS(',',NEW.ID, NEW.Name, NEW.Type, NEW.Value);
可以将其简化为包含整个新行的内容吗?:
SET v1 = CONCAT_WS(',',NEW.*);
(我尝试过以上的变体但是会导致语法错误)
由于
答案 0 :(得分:0)
不,没有简单的方法可以做到这一点。你必须引用每一列。
唯一真正的解决方法是使用表元数据来帮助您生成所需的语句,然后在过程中包含该语句。
即使可能,您也不希望在TRIGGER中动态执行此操作。
SELECT CONCAT('NEW.`',GROUP_CONCAT(c.column_name
ORDER BY ORDINAL_POSITION SEPARATOR '`,NEW.`'),'`')
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = 'mytable'
这应该会给你一个看起来像这样的字符串:
NEW.`ID`,NEW.`Name`,NEW.`Type`,NEW.`Value`
您可以将其粘贴到触发器主体中。 (当然你可以扩展CONCAT来生成整行。)
缺点是当新列添加到表中时,不会自动包含这些列;这需要改变触发器。如果列被删除或重命名,您的触发器将开始抛出异常;再次需要修复触发器。
更新
问:如何将此字符串转换为MySQL查询?
@query = "CONCAT_WS(',','CCC','64',NEW.Record,NEW.ID,NEW.Name,NEW.User_ID,NEW.State_Record,NEW.Hash);"
我不会将其转换为查询。我只是在触发器的主体中使用它作为静态代码行(没有双引号),就像你在TRIGGER中的原始语句一样。
SET v1 = CONCAT_WS(',','CCC','64',NEW.Record,NEW.ID,NEW.Name,NEW.User_ID,NEW.State_Record,NEW.Hash);
(目前尚不清楚你打算用这个字符串做什么。)
如果您尝试创建SELECT语句,可以尝试从字符串末尾删除该分号,并在其上添加SELECT关键字。但我不认为新的。将在该上下文中识别对当前行的列值的引用。这可能会发生,但你需要测试。
如果我需要做类似的事情,我会使用用户变量
来做SET @new_id = NEW.ID;
SET @new_name = NEW.Name;
SELECT @new_id, @new_name
我一点也不清楚你要对查询返回的结果集做什么。如果您尝试审核对表的更改,则规范模式是将列值的INSERT运行到changelog表中,
INSERT INTO mytable_changelog (ID, Name) VALUES (NEW.ID, NEW.Name);
这实际上取决于你想要完成的事情。