gpt4 book ai didi

mysql - 如果存在一种组合,则在插入/更新表时触发

转载 作者:行者123 更新时间:2023-11-29 15:43:32 24 4
gpt4 key购买 nike

一个表有三行:analysisId(int, AUTO_INCRMENT)、dataId(int, 来自另一个表的外键)、first_attempt(bool)我有一个触发器,它应该是一个检查整个表的约束,如果有一个“dataId”的first_attempt为1,那么您不能添加另一个 dataId 且first_attempt 为“1”。但是,如果之前使用过 dataId,并且first_attempt 为 0,则它应该接受任意数量的条目。

我写了一个触发器,但是 mysql 一直抛出语法错误,我不确定问题出在哪里。

这是我的表格:

CREATE TABLE table1 (
dataId int NOT NULL AUTO_INCREMENT,
machine char(20) NOT NULL,
run char(25) NOT NULL,
PRIMARY KEY (dataId)
) ENGINE=INNODB;


CREATE TABLE table2 (
analysisId int NOT NULL AUTO_INCREMENT,
dataId int NOT NULL,
first_attempt boolean,
PRIMARY KEY (analysisId),
FOREIGN KEY (dataId)
REFERENCES seq_data(dataId)
ON DELETE CASCADE
) ENGINE=INNODB;

使用虚拟值填充数据:

INSERT INTO `table1` (`dataId`, `machine`, `run`) VALUES (DEFAULT, 'mac1', 'first_run');
INSERT INTO `table2` (`analysisId`, `dataId`, `clinical`) VALUES (DEFAULT, 1, 1);
DELIMITER $$
CREATE TRIGGER `insert_trigger` BEFORE INSERT ON `clinical_gatekeeper`
FOR EACH ROW
BEGIN
IF (NEW.dataId = table2.dataId ) THEN
SELECT CONCAT(NEW.dataId, " has already completed one successful run!") INTO @error_text;
SIGNAL SQLSTATE "45000" SET message_text = @error_text;
END IF;
END;$$
DELIMITER ;

就我个人而言,我认为 IF (NEW.dataId = table2.dataId ) THEN 存在问题 因为如果我用 table2.dataId 替换 1,它就可以工作!

最佳答案

DELIMITER $$
CREATE TRIGGER `insert_trigger` BEFORE INSERT ON `table2`
FOR EACH ROW
BEGIN
IF EXISTS(SELECT 1 FROM table2 WHERE dataId = NEW.dataId AND clinical = NEW.clinical AND clinical = 1) THEN
SELECT CONCAT(NEW.dataId, " has already completed one successful run!") INTO @error_text;
SIGNAL SQLSTATE "45000" SET message_text = @error_text;
END IF;
END;$$
DELIMITER ;

关于mysql - 如果存在一种组合,则在插入/更新表时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57323094/

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