MySql插入触发器输出NULL

时间:2016-11-13 05:47:51

标签: mysql triggers

我想要一个插入触发器来实现增量插入。我有一列“row_hash”来记录每行的MD5(这里我使用列name的MD5和category)。如果新记录具有相同的哈希值,则触发器应跳过插入,否则允许插入。

DROP TRIGGER IF EXISTS test_trigger;
DELIMITER $$
CREATE TRIGGER test_trigger BEFORE INSERT ON test_table FOR EACH ROW
BEGIN
    IF (SELECT COUNT(*) FROM test_table WHERE row_hash = MD5(CONCAT_WS('', new.name, new.category))) < 1 THEN
        INSERT INTO test_table(_id, name, category, row_hash) VALUES (new._id, new.name, new.category, MD5(CONCAT_WS('', new.name, new.category)));
    END IF;
END$$

这是测试表:

create table test_table(_id varchar(10) primary key, name varchar(10), category varchar(2), row_hash char(32));

当我插入一条记录时,它会在row_hash列上输出NULL。

insert into test_table(_id, name, category) values('12344', 'dafas', 'A');

'12344','dafas','A',NULL

你能告诉我在触发器上我做错了吗?

1 个答案:

答案 0 :(得分:0)

如果要修改要插入的行,则无需在同一个表中使用INSERT。只需SET NEW.row_hash个值。

如果要中止插入,则必须使用SIGNAL

但总的来说,看起来你正在做的事情根本不应该在触发器中需要条件INSERT。名称,类别只有UNIQUE约束。在触发器中,只需确保row_hash设置正确,然后如果存在重复,则约束将负责中止。

编辑:根据您的建议,将唯一键更改为仅使用row_hash列。

ALTER TABLE test_table ADD UNIQUE KEY (row_hash);

CREATE TRIGGER test_trigger BEFORE INSERT ON test_table
FOR EACH ROW SET NEW.row_hash = MD5(CONCAT_WS('', name, category));