MySQL 来自 Table 的默认记录
MySQL Default Record from Table
我使用 MySQL 5.6,我有 3 个 table。其中两个是数据列表,第三个table用于它们之间的关系。在第三个 table 中,我想为每个 id1 标识一条默认记录,因此我添加了一个名为 predt 的列,让我知道哪条记录是默认记录。像这样:
id1 | id2 | predt
1 | 1 | 0
1 | 2 | 1
1 | 3 | 0
在这个例子中,我会知道第二行是 id1 = 1 的默认行。
让我担心的是,对于列 predt,其中 id1 = 1,可能不止一条记录的值为 1。
我验证这不会发生,这是我在 SP 中插入或更新此 table 中的记录的第一件事。但是如果有人直接更新 table 则 table 中没有任何限制来阻止它这样做(就像外键限制)。
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;
我一直以同样的方式对待这个案例,到目前为止它奏效了。但是我想知道是否有更好的方法来处理这种情况。
您应该测试该特定行是否已经存在这样的 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 ;
我使用 MySQL 5.6,我有 3 个 table。其中两个是数据列表,第三个table用于它们之间的关系。在第三个 table 中,我想为每个 id1 标识一条默认记录,因此我添加了一个名为 predt 的列,让我知道哪条记录是默认记录。像这样:
id1 | id2 | predt
1 | 1 | 0
1 | 2 | 1
1 | 3 | 0
在这个例子中,我会知道第二行是 id1 = 1 的默认行。
让我担心的是,对于列 predt,其中 id1 = 1,可能不止一条记录的值为 1。
我验证这不会发生,这是我在 SP 中插入或更新此 table 中的记录的第一件事。但是如果有人直接更新 table 则 table 中没有任何限制来阻止它这样做(就像外键限制)。
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;
我一直以同样的方式对待这个案例,到目前为止它奏效了。但是我想知道是否有更好的方法来处理这种情况。
您应该测试该特定行是否已经存在这样的 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 ;