【问题标题】:How to create Trigger to prevent inserting the duplicate row in MYSQL 5.0.27?如何创建触发器以防止在 MYSQL 5.0.27 中插入重复行?
【发布时间】:2014-09-19 03:13:45
【问题描述】:

这个问题是对上一个问题的后续。 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?

我有一张表 MyText,其中有 ID 列、text 列和许多其他列

Id - 文本 - 类型 ..& 其他文件 1 - 这是我的文字 2 - xxxx

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

因此,解决方案是创建一个触发器,以防止用户插入重复项。例如,如果用户在MyText 表中插入“THIS is My Text”(我们不区分大小写),那么 Mysql 将完全中止包含该插入语句的所有查询并生成一个SQLException 以防止系统做其他查询。

好的,假设您必须在 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 版本,已经很老了,但我喜欢它

那么如何创建满足我要求的触发器或如何解决我的问题?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

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

    相反,创建一个附加列来存储您的值的 MD5SHA1 哈希,并使用约束使该列唯一。

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

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

    【讨论】:

    • 这个。但请注意,您可能会收到hash collisions。确保您的应用程序能够适应这些情况。
    • @MichaelGreen 虽然我同意散列冲突的理论上的可能性,但在实践中这种可能性会很低,甚至不值得考虑。另请参阅answer
    • 我被告知风险是可能性和影响的函数。我同意哈希冲突的可能性很低,但无法判断它可能对他的系统产生的影响。这就是为什么我建议应用程序应该具有“弹性”,即可以继续以有意义的方式运行,而不是“重新编码以解决”冲突。
    猜你喜欢
    • 2011-05-14
    • 2013-12-26
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2011-03-08
    • 2019-03-30
    • 1970-01-01
    • 2017-04-26
    相关资源
    最近更新 更多