【问题标题】:How do I implement a trigger in MYSQL to prevent insertion when row has duplicate data?当行有重复数据时,如何在 MYSQL 中实现触发器以防止插入?
【发布时间】:2012-10-18 03:43:54
【问题描述】:
CREATE TABLE preferences(
    user_id INT,
    hot_sid INT,
    not_sid INT,
)Engine = InnoDB;


CREATE TRIGGER check_show_comparison
AFTER INSERT ON preferences
REFERENCING NEW ROW
FOR EACH ROW
WHEN ( hot_sid = not_sid )
ROLLBACK TRANSACTION;

所以我正在尝试使用 MYSQL 建立一个数据库来跟踪类似于热或不热的东西。实际目的并不重要,但基本上我有一个名为preferences 的表,其中包含三列,第一列是用户ID,第二列和第三列是偏好ID,它们代表相同类型的对象。 (以 hot or not 为例,hot_sid 将存储“hot”实体的 id,not_sid 将存储“not”实体的 id。这两个实体是同一类型)。

我正在尝试在每次插入表时编写一个触发器,以防止有人添加对 hot 和 not 具有相同 sid 的行。实施此检查约束时我做错了什么?我考虑过只使用检查约束,但我不相信它们实际上是在 MYSQL 中强制执行的。

感谢您的帮助!

【问题讨论】:

标签: mysql


【解决方案1】:

你是对的 - MySQL 的 DDL 支持检查约束,但忽略了。 来自参考 - CHECK 子句被解析但被所有存储引擎忽略。

解决方案是创建一个 BEFORE INSERT 触发器,检查新值并在需要时从触发器中抛出错误。

要引发错误,您可以使用:

  • SIGNAL statement: SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'hot_sid = not_sid';
  • 调用不存在的存储过程:CALL proc_error();

【讨论】:

    猜你喜欢
    • 2014-09-19
    • 1970-01-01
    • 2011-03-08
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2019-03-30
    • 1970-01-01
    相关资源
    最近更新 更多