我想要一个插入触发器来实现增量插入。我有一列“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
你能告诉我在触发器上我做错了吗?
答案 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));