我的数据库中有以下三个字段:
位置
composite_index
我想对这些设置一个唯一约束,因此不允许以下内容:
"David-20140101-NULL"
"David-20140101-NULL"
因为我想将NULL
计为实际值(例如''
),所以我无法ALTER TABLE ADD UNIQUE KEY (name,birth,location)
。如何在上面添加INSERT+UPDATE
触发器以更新compositive_index
辅助字段?
答案 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);
此索引现在可确保无法将记录作为重复项插入
你必须看看它是否需要在触发器之前或之后:
update
,before
将起作用并且最好:这样就会在执行更新之前检查更新的唯一性,并在发生唯一性冲突时快速失败; insert
我认为它必须是一个后触发器。)