Как вы oop имена всех столбцов в триггере без жесткого их кодирования - PullRequest
1 голос
/ 17 апреля 2020

Я хочу создать триггер (вставка / обновление), который проверяет, являются ли все значения столбца (кроме значений в первичном ключе) в записи нулевыми. Количество столбцов может меняться, поэтому я sh на 'l oop' будет иметь имена столбцов, а не жесткое кодирование столбцов в триггере. Ниже очень упрощенный пример моей схемы базы данных

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

Для триггеров вставки и обновления для столбца rowEmpty должно быть установлено значение 'yes' для идентификатора записи 4. Для всех других записей rowEmpty должно быть 'no'.

Как сделать il oop для всех имен столбцов в триггере без жесткого их кодирования?

1 Ответ

1 голос
/ 17 апреля 2020

Почему бы просто не использовать сгенерированный столбец для этого?

Разумеется, что все же требует перечисления всех столбцов, но только один раз, и непосредственно в определении таблицы (где, очевидно, доступны имена столбцов). И это экономит ваши усилия по созданию триггера для каждой операции 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;
...