您如何在触发器中循环访问所有列名称而无需对其进行硬编码

问题描述 投票:0回答:1

我想创建一个触发器(插入/更新),该触发器检查记录中的所有列值(主键中的那些值除外)是否为空。列数可以更改,因此我希望“循环”列名,而不是在触发器中对列进行硬编码。下面是我的数据库方案的非常简化的示例

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'。

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

mysql sql database-trigger create-table
1个回答
0
投票

为什么不简单地使用生成的列呢?

当然,该still要求您枚举所有列,但仅枚举一次,并且直接在表定义中枚举(显然,列名可用)。这样可以节省您为每个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;
© www.soinside.com 2019 - 2024. All rights reserved.