如何在不对它们进行硬编码的情况下循环触发器中的所有列名称
How do you loop all columns names in a trigger without hard coding them
我想创建一个触发器(插入/更新)来检查记录中的所有列值(主键中的列除外)是否为空。列数可以更改,因此我希望 'loop' 列名而不是对触发器中的列进行硬编码。下面是我的数据库方案的非常简化的示例
CREATE TABLE `specs` (
`id` int(11) NOT NULL,
`spec1` enum('yes','no') DEFAULT NULL,
`spec2` enum('yes','no') DEFAULT NULL,
`spec3` enum('yes','no') DEFAULT NULL,
`spec4` enum('yes','no') DEFAULT NULL,
`spec5` enum('yes','no') DEFAULT NULL,
/* ... can be any number of columns */
`rowEmpty` enum('yes','no') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into specs (`id`,`spec1`,`spec2`,`spec3`,`spec4`,`spec5`)
VALUES (1,null,'yes',null,null,null),(2,null,null,'no',null,null),(3,'yes','no',null,null,null),(4,null,null,null,null,null),(5,null,'yes',null,'yes','yes'),(6,null,null,null,'no',null),(7,null,null,null,null,null);
Update specs set `spec1` = 'yes' where id = 7
对于记录 ID 4,插入和更新触发器应将列 rowEmpty 设置为 'yes'。对于所有其他记录,rowEmpty 应为 'no'。
如何在不对它们进行硬编码的情况下循环到触发器中的所有列名称?
为什么不直接使用生成的列呢?
当然,仍然 需要您枚举所有列,但只需要一次,并且直接在 table 定义中(显然,列名是可用的)。这样就省去了为每个 DML 操作创建触发器的工作:
create table specs (
id int(11) not null,
spec1 enum('yes','no') default null,
spec2 enum('yes','no') default null,
spec3 enum('yes','no') default null,
spec4 enum('yes','no') default null,
spec5 enum('yes','no') default null,
rowempty enum('yes','no') as (
case when coalesce(spec1, spec2, spec3, spec4, spec5) is null
then 'yes'
else 'no'
end),
primary key (id)
) engine=innodb default charset=utf8;
我想创建一个触发器(插入/更新)来检查记录中的所有列值(主键中的列除外)是否为空。列数可以更改,因此我希望 'loop' 列名而不是对触发器中的列进行硬编码。下面是我的数据库方案的非常简化的示例
CREATE TABLE `specs` (
`id` int(11) NOT NULL,
`spec1` enum('yes','no') DEFAULT NULL,
`spec2` enum('yes','no') DEFAULT NULL,
`spec3` enum('yes','no') DEFAULT NULL,
`spec4` enum('yes','no') DEFAULT NULL,
`spec5` enum('yes','no') DEFAULT NULL,
/* ... can be any number of columns */
`rowEmpty` enum('yes','no') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into specs (`id`,`spec1`,`spec2`,`spec3`,`spec4`,`spec5`)
VALUES (1,null,'yes',null,null,null),(2,null,null,'no',null,null),(3,'yes','no',null,null,null),(4,null,null,null,null,null),(5,null,'yes',null,'yes','yes'),(6,null,null,null,'no',null),(7,null,null,null,null,null);
Update specs set `spec1` = 'yes' where id = 7
对于记录 ID 4,插入和更新触发器应将列 rowEmpty 设置为 'yes'。对于所有其他记录,rowEmpty 应为 'no'。
如何在不对它们进行硬编码的情况下循环到触发器中的所有列名称?
为什么不直接使用生成的列呢?
当然,仍然 需要您枚举所有列,但只需要一次,并且直接在 table 定义中(显然,列名是可用的)。这样就省去了为每个 DML 操作创建触发器的工作:
create table specs (
id int(11) not null,
spec1 enum('yes','no') default null,
spec2 enum('yes','no') default null,
spec3 enum('yes','no') default null,
spec4 enum('yes','no') default null,
spec5 enum('yes','no') default null,
rowempty enum('yes','no') as (
case when coalesce(spec1, spec2, spec3, spec4, spec5) is null
then 'yes'
else 'no'
end),
primary key (id)
) engine=innodb default charset=utf8;