如何在不对它们进行硬编码的情况下循环触发器中的所有列名称

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;