0
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,第二列和第三列是preference id,它们代表相同类型的对象。(以 hot or not 为例,hot_sid 将存储“hot”实体的 id,not_sid 将存储“not”实体的 id。这两个实体是同一类型)。

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

感谢您的帮助!

4

1 回答 1

0

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

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

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

  • 信号声明SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'hot_sid = not_sid';
  • 调用不存在的存储过程:CALL proc_error();
于 2012-10-18T06:21:21.240 回答