Столбец a
содержит массив json, отформатированный как [1,4,3,6]
Я хочу, чтобы столбец b
был суммой столбца a
.
ALTER TABLE `T` ADD `b` int AS
(SELECT SUM(t.c) FROM JSON_TABLE(a, '$[*]' COLUMNS (c INT PATH '$')) AS t) NULL;
1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'SELECT SUM(t.c) FROM JSON_TABLE(a, '$[*]' COLUMNS (c INT PATH '$')) AS t) NULL' в линия 1
работает ли выбор и дает ли ожидаемый результат?
В этом разделе документов MySQL указаны правила для сгенерированных столбцов. Наиболее актуальными здесь кажутся два:
- Допускаются литералы, детерминированные встроенные функции и операторы.
- Подзапросы не допускаются.
Вы можете добиться «аналогичной» функциональности с помощью пары триггеров:
DELIMITER $$
CREATE TRIGGER `test_t_b_insert` BEFORE INSERT ON `t`
FOR EACH ROW BEGIN
SET NEW.b = (SELECT SUM(t.c) FROM JSON_TABLE(NEW.a, '$[*]' COLUMNS (c INT PATH '$')) AS t);
END$$
CREATE TRIGGER `test_t_b_update` BEFORE UPDATE ON `t`
FOR EACH ROW BEGIN
IF NOT OLD.a <=> NEW.a THEN
SET NEW.b = (SELECT SUM(t.c) FROM JSON_TABLE(NEW.a, '$[*]' COLUMNS (c INT PATH '$')) AS t);
END IF;
END$$
DELIMITER ;
Возможно, стоит взглянуть на триггеры здесь, alter table делает что-то со столбцами один раз, а не тогда, когда происходит событие (например, вставка, обновление и т. д.).