gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:30:54 34 4
gpt4 key购买 nike

你能帮我解决这个问题吗?我在 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 表中只是为了创建约束违规,以便 DB 中止操作。

现在,通常情况下,当我向 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com