Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
表中的MySQL默认记录_Mysql_Sql_Database Design_Triggers - Fatal编程技术网

表中的MySQL默认记录

表中的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中插入或更新此表

我使用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中插入或更新此表中记录的第一件事。但是如果有人直接更新表,表中没有阻止它这样做的限制(比如外键限制)


我一直以同样的方式处理这个案子,到目前为止,它已经奏效了。但是我想知道是否有更好的方法来处理这种情况。

您应该测试该行是否已经存在这样的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本身