MySQL触发器(替换断言)不起作用

时间:2012-11-11 22:43:56

标签: mysql triggers assertions

你能帮我解决这个问题吗?我在MySQL数据库中有两个表:

ServiceProvider(SPID, Name, ... etc.)
hasTag(SPID, TagID)

每个服务提供商应至少有一个标签,最多五个标签。 max-constraint不是问题,但min-constraint拒绝正常工作。我首先尝试通过断言实现这一点,但后来我发现,MySQL不支持断言。因此,我写了以下触发器:

delimiter |

CREATE  TRIGGER MinTags BEFORE INSERT
        ON ServiceProvider
        FOR EACH ROW BEGIN
            IF EXISTS (SELECT SPID FROM ServiceProvider
                       WHERE NOT EXISTS (SELECT DISTINCT SPID FROM hasTag))
            THEN INSERT INTO stop_action VALUES(1, 'Assert Failure');
            END IF;
        END;
|

delimiter ;

'Assert Failure'插入stop_action表仅用于创建约束违规,以便DB中止操作。

现在,通常,当我在ServiceProvider表中插入任何值而不在hasTag表中插入任何内容时,我应该收到错误,对吧?但是,不知何故它不起作用......我可以在ServiceProvider表中插入任何我想要的东西,而不会收到任何错误。你知道吗,我的代码出了什么问题?

2 个答案:

答案 0 :(得分:1)

如何对一点点反规范化:

ALTER TABLE ServiceProvider
  ADD COLUMN TagID1 BIGINT UNSIGNED NOT NULL,
  ADD COLUMN TagID2 BIGINT UNSIGNED NULL,
  ADD COLUMN TagID3 BIGINT UNSIGNED NULL,
  ADD COLUMN TagID4 BIGINT UNSIGNED NULL,
  ADD COLUMN TagID5 BIGINT UNSIGNED NULL;

如果合适,包括外键约束。

答案 1 :(得分:1)

如上所述,此触发器甚至不使用要插入的行中的值。

获取SPID列值的语法是:

NEW.SPID

另外,请考虑使用SIGNAL语句引发错误。

如果你想在SQL中使用ASSERT,这篇文章可能有所帮助:

SQL Scripts - Does the equivalent of a #define exist?