问题描述
我使用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中插入或更新此表中的记录的第一件事。但是,如果有人直接更新该表,则该表中没有任何限制可以阻止它这样做(例如外键限制)。
create table table1 (
id int(10) not null auto_increment,description varchar(100) not null,primary key(id))
engine innodb,default character set latin1;
create table table2 (
id int(10) not null auto_increment,default character set latin1;
create table table3 (
id1 int(10) not null,id2 int(10) not null,predt tinyint(1) not null default 0,primary key(id1,id2))
engine innodb,default character set latin1;
我总是以相同的方式对待这种情况,到目前为止,它一直有效。但是我想知道是否有更好的方法来处理这种情况。
解决方法
您应该测试该特定行是否已经存在predt = 1 在更高版本的mysql中,您可以出于相同目的使用CHECK约束
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 ;