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

标签 mysql triggers assertions

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

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

每个服务提供商应该至少有一个标签,最多五个标签。最大约束不是问题,但最小约束无法正常工作。我首先尝试通过断言来实现这一点,但后来我发现,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表中只是为了创建约束违规,以便数据库中止该操作。

现在,通常情况下,当我将任何值插入到 ServiceProvider 表中,而不向 hasTag 表中插入任何内容时,我应该会收到错误,对吧?但是,不知怎的,它不起作用......我可以将任何我想要的内容插入 ServiceProvider 表中,而不会收到任何类型的错误。你知道我的代码有什么问题吗?

最佳答案

稍微反规范化一下怎么样:

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;

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

关于MySQL触发器(替换断言)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13336263/

相关文章:

php - 解码从 mysql 数据库中检索到的字符串

mysql - SELECT 内的 SELECT MySQL 查询速度较慢

mysql - 错误: #1242 - Subquery returns more than 1 row

javascript - jquery自定义键码触发器不起作用

MySQL在插入tbl1时创建触发器也插入到tbl2

c++ - DirectX 11 : Runtime Assertion Failure using XMLoadFloat4X4()

php - Laravel 路由到相同 View 不同功能

PHP, MySQL - 简单的搜索结果不需要

c# - NUnit Assert.Throws 吞噬控制台输出

authentication - OAuth2 SAML授权授予中的SubjectConfirmation是什么意思?