创建mysql插入/更新完整性触发器

时间:2016-03-18 21:01:11

标签: mysql sql triggers

我的数据库中有以下三个字段:

  • 名称
  • 位置

  • composite_index

我想对这些设置一个唯一约束,因此不允许以下内容:

"David-20140101-NULL"
"David-20140101-NULL"

因为我想将NULL计为实际值(例如''),所以我无法ALTER TABLE ADD UNIQUE KEY (name,birth,location)。如何在上面添加INSERT+UPDATE触发器以更新compositive_index辅助字段?

1 个答案:

答案 0 :(得分:1)

由于mysql中仍然没有基于函数的索引,因此您必须创建一个帮助列(名称为composite_index)(您可以使用触发器进行管理)。然后,此辅助列具有唯一的索引,完全满足您的要求。

为此,您需要创建两个触发器。插入触发器和更新前触发器。这些需要在下面有一行:

CREATE TRIGGER {unique triggername} AFTER INSERT ON {table}
BEGIN
 UPDATE {table} SET composite_index=CONCAT(yourvalues) WHERE id=new.id;
END;

CREATE TRIGGER {unique triggername} BEFORE UPDATE ON {table}
BEGIN
 UPDATE {table} SET composite_index=CONCAT({yourvalues}) WHERE id=new.id;
END;

此{yourvalues}是new.{columnname}

另外,您必须添加一个唯一索引:

CREATE INDEX idx_un_1 ON {table}(composite_index);

此索引现在可确保无法将记录作为重复项插入

你必须看看它是否需要在触发器之前或之后:

  • 对于updatebefore将起作用并且最好:这样就会在执行更新之前检查更新的唯一性,并在发生唯一性冲突时快速失败;
  • for insert我认为它必须是一个后触发器。)