【问题标题】:MySQL Default Record from Table表中的 MySQL 默认记录
【发布时间】:2020-12-08 01:35:04
【问题描述】:

我使用 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,
description varchar(100) not null,
primary key(id))
engine innodb,
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;

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

【问题讨论】:

  • 好吧,您可以将逻辑构建到 INSERT 本身中

标签: mysql sql database-design triggers


【解决方案1】:

您应该测试该特定行是否已经存在,例如 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 ;

【讨论】:

  • 谢谢,使用触发器似乎是一种很好的控制方式。这是最推荐的处理方式吗?除了 CHECK 或 TRIGGERS 还有其他方法吗?
  • 不,这是唯一的方法。触发旧版本的 mysql 检查 mysql 8
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多