2

你能帮我解决这个问题吗?我在数据库中有两个表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表中,而不会收到任何错误。你知道,我的代码有什么问题吗?

4

2 回答 2

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;

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

于 2012-11-11T22:46:47.777 回答
1

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

获取 SPID 列值的语法是:

NEW.SPID

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

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

SQL 脚本 - 是否存在与 #define 等效的内容?

于 2012-11-12T08:58:26.080 回答