表中的MySQL默认记录

问题描述

我使用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 ;

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...