表中的MySQL默认记录
我使用MySQL 5.6,我有3个表。其中两个是数据列表,第三个表用于它们之间的关系。在第三个表中,我想为每个id1标识一个默认记录,因此我添加了一个名为predt的列,以让我知道哪个记录是默认记录。大概是这样的:表中的MySQL默认记录,mysql,sql,database-design,triggers,Mysql,Sql,Database Design,Triggers,我使用MySQL 5.6,我有3个表。其中两个是数据列表,第三个表用于它们之间的关系。在第三个表中,我想为每个id1标识一个默认记录,因此我添加了一个名为predt的列,以让我知道哪个记录是默认记录。大概是这样的: id1 | id2 | predt 1 | 1 | 0 1 | 2 | 1 1 | 3 | 0 在这个例子中,我知道第二行是id1=1的默认行 让我担心的是,在id1=1的列predt中,可能有多条记录的值为1 我验证这不会发生,这是我在SP中插入或更新此表
id1 | id2 | predt
1 | 1 | 0
1 | 2 | 1
1 | 3 | 0
在这个例子中,我知道第二行是id1=1的默认行
让我担心的是,在id1=1的列predt中,可能有多条记录的值为1
我验证这不会发生,这是我在SP中插入或更新此表中记录的第一件事。但是如果有人直接更新表,表中没有阻止它这样做的限制(比如外键限制)
我一直以同样的方式处理这个案子,到目前为止,它已经奏效了。但是我想知道是否有更好的方法来处理这种情况。您应该测试该行是否已经存在这样的predt=1 在更高的mysql版本中,可以使用具有相同用途的检查约束
DELIMITER $$
CREATE TRIGGER before_insert_table3
BEFORE INSERT
ON table3 FOR EACH ROW
BEGIN
IF NEW.predt = 1 then
IF EXISTS(SELECT 1 FROM table3 WHERE predt = 1 AND id1 = NEW.id1) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = ' predt 1 already exist';
END IF;
END IF;
END $$
DELIMITER ;
DELIMITER $$CREATE TRIGGER before_update_table3
BEFORE UPDATE
ON table3 FOR EACH ROW
BEGIN
IF NEW.predt = 1 then
IF EXISTS(SELECT 1 FROM table3 WHERE predt = 1 AND id1 = NEW.id1) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = ' predt 1 already exist';
END IF;
END IF;
END $$
DELIMITER ;
您应该测试该特定行是否已经存在,例如predt=1 在更高的mysql版本中,可以使用具有相同用途的检查约束
DELIMITER $$
CREATE TRIGGER before_insert_table3
BEFORE INSERT
ON table3 FOR EACH ROW
BEGIN
IF NEW.predt = 1 then
IF EXISTS(SELECT 1 FROM table3 WHERE predt = 1 AND id1 = NEW.id1) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = ' predt 1 already exist';
END IF;
END IF;
END $$
DELIMITER ;
DELIMITER $$CREATE TRIGGER before_update_table3
BEFORE UPDATE
ON table3 FOR EACH ROW
BEGIN
IF NEW.predt = 1 then
IF EXISTS(SELECT 1 FROM table3 WHERE predt = 1 AND id1 = NEW.id1) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = ' predt 1 already exist';
END IF;
END IF;
END $$
DELIMITER ;
谢谢,使用触发器似乎是一种很好的控制方法。这是最值得推荐的处理方法吗?除了检查或触发器,还有其他方法吗?没有,这是唯一的方法。旧版本mysql的触发器检查mysql。谢谢,使用触发器似乎是一种很好的控制方法。这是最值得推荐的处理方法吗?除了检查或触发器,还有其他方法吗?没有,这是唯一的方法。触发器对于旧版本的mysql检查mysql 8那么,您可以将逻辑构建到INSERT本身,也可以将逻辑构建到INSERT本身