mysql - sql 触发器在变量中存储列名并将其用于 sql 触发器中的 OLD.myvar 时出现错误

标签 mysql sql triggers database-trigger

MySQL 说:#1054 - “OLD”中存在未知列“TMPCOL”

BEGIN
DECLARE TOTAL,I INT;
DECLARE CURRENT_CLOUMN VARCHAR(255);
DECLARE TRIGGER_ON_TABLE VARCHAR(255);
DECLARE TRIGGER_OP VARCHAR(255);
DECLARE olddd VARCHAR(255);
DECLARE newwww VARCHAR(255);
SET TOTAL=0;
SET I=0;
SET CURRENT_CLOUMN='atulbaldaniya.com';
SET TRIGGER_ON_TABLE='atulbaldaniya';
SET TRIGGER_OP='UPDATE';
SET olddd='';
SET newwww='';

SELECT COUNT(COLUMN_NAME) INTO  TOTAL  FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = TRIGGER_ON_TABLE ORDER BY ORDINAL_POSITION;
    WHILE I < TOTAL DO
        SELECT COLUMN_NAME INTO CURRENT_CLOUMN FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = TRIGGER_ON_TABLE ORDER BY ORDINAL_POSITION LIMIT I,1;
        SET olddd=OLD.CURRENT_CLOUMN;
        SET newwww=NEW.CURRENT_CLOUMN;
            IF(olddd != newwww) THEN
                INSERT INTO TMP(DATA1, DATA2)VALUES(TOTAL ,CONCAT('Change in ',olddd,' To ',newwww))
            END IF; 
        SET I=I+1;
    END WHILE ;
END

我不想
INSERT INTO TMP(DATA1, DATA2)VALUES(TOTAL,OLD.ID);
这工作正常。

我想将列名称存储在变量中并使用 OLD.MYVAR

我们怎样才能这样做呢?

最佳答案

您可以将查询构建为字符串,然后准备并执行它,类似于:

SET @s = CONCAT('INSERT INTO TMP(DATA1, DATA2) VALUES ("DATA",OLD.',TMPCOL,');');

PREPARE stmt1 FROM @s;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;

关于mysql - sql 触发器在变量中存储列名并将其用于 sql 触发器中的 OLD.myvar 时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49505921/

相关文章:

mysql - SQL 外键

sql-server - 如何在SQL Server中删除触发器?

amazon-web-services - AWS Cognito - PostSignUp 触发器不起作用

mysql - 如果更新,则在同一张表上执行触发器

mysql - Heroku 部署失败 MySQL rake 中止同一文件

mysql - 查询 PostgreSQL 返回一个 NoneType

php - 按字母顺序排列阿拉伯名称 Mysql & php

php - 从许多表中删除数据的正确方法是什么?

mysql - 错误 1214 (HY000) : The used table type doesn't support FULLTEXT indexes

java - 找不到合适的驱动程序发现 odbc、db2 错误