如何创建触发器以防止在MYSQL 5.0.27中插入重复行?

时间:2014-07-27 23:26:04

标签: mysql sql

这个问题跟进了以前的问题。 is it possible to make a field in Mysql table to to have length max=700, to be unicode (3 bytes) and to be unique?

我的表MyTextID列,text列&许多其他专栏

Id - text           - type ..& other fileds
1  - this is my text
2  - xxxx

我希望text列支持unicode,最大长度可以容纳700个Unicode字符。我无法设置Unique (text),因为MYSQL仅支持765字节的最大长度用于唯一列,而Unicode则需要3个字节,所以我需要2100字节(700 * 3)的唯一列。

因此,解决方案是创建一个阻止用户插入副本的触发器。例如,如果用户插入" THIS is My Text" (我们不关心区分大小写)到MyText表中,然后Mysql将完全中止包含该Inserting语句的所有查询,并生成SQLException以阻止系统执行其他查询。 / p>

好的,假设您必须在Java代码中运行一系列sql语句

insert into MyText('THIS is My Text',1);
insert into OtherTable ('some text');
update othetTable...

然后,当系统执行insert into MyText('THIS is My Text',1);时,它应该停止在其下面执行其他查询。

此外,有些人建议prefix index帮助Nysql更快地执行select,但我不确定它是否太必要,因为我得到了索引的ID列。

注意:MYSQL 5.027是2006年的版本,它很老了,但我喜欢它

那么如何创建符合我要求的触发器或如何解决我的问题呢?

1 个答案:

答案 0 :(得分:4)

由于性能原因,我建议不要使用触发器。

而是创建一个额外的列来存储值的MD5SHA1哈希,并使用约束使该列唯一。

根据上述链接,您的MySQL版本中都存在散列函数。或者,如果将它集成到Java代码中更容易,则可以使用MessageDigest类在Java中进行散列。

如果insert语句由于重复而失败,那么您在问题中指出不应执行进一步查询的部分最好使用transactions来处理。 Java中也支持使用普通JDBC或大多数ORM框架。