Колонка рассчитана из другого столбца?
Учитывая следующую таблицу:
id | value
--------------
1 6
2 70
Есть ли способ добавить столбец, который автоматически вычисляется на основе другого столбца в той же таблице? Как VIEW, но часть той же таблицы. Например, calculated
будет половиной value
. calculated
должен автоматически обновляться при изменении value
, так же, как и VIEW.
Результат:
id | value | calculated
-----------------------
1 6 3
2 70 35
Ответы
Ответ 1
Если это выбор, вы можете сделать это как:
SELECT id, value, (value/2) AS calculated FROM mytable
В противном случае вы также можете сначала изменить таблицу, чтобы добавить отсутствующий столбец, а затем выполнить запрос UPDATE для вычисления значений для нового столбца как:
UPDATE mytable SET calculated = value/2;
Если он должен быть автоматическим, и ваша версия MySQL позволяет это, вы можете попробовать triggers
Ответ 2
MySQL 5.7 поддерживает вычисленные столбцы. Они называют это "Generated Columns", и синтаксис немного странный, но он поддерживает те же параметры, что и в других базах данных.
https://dev.mysql.com/doc/refman/5.7/en/create-table.html#create-table-generated-columns
Ответ 3
@krtek ответ находится в правильном направлении, но имеет пару проблем.
Плохая новость заключается в том, что использование UPDATE в триггере в той же таблице не будет работать. Хорошей новостью является то, что это не обязательно; есть объект NEW, с которым вы можете работать, прежде чем стол будет даже затронут.
Триггер становится:
CREATE TRIGGER halfcolumn_update BEFORE UPDATE ON my_table
FOR EACH ROW BEGIN
SET NEW.calculated = NEW.value/2;
END;
Обратите внимание, что BEGIN... END; синтаксис должен анализироваться с другим разграничителем. Весь shebang становится:
DELIMITER |
CREATE TRIGGER halfcolumn_insert BEFORE INSERT ON my_table
FOR EACH ROW BEGIN
SET NEW.calculated = NEW.value/2;
END;
|
CREATE TRIGGER halfcolumn_update BEFORE UPDATE ON my_table
FOR EACH ROW BEGIN
SET NEW.calculated = NEW.value/2;
END;
|
DELIMITER ;
Ответ 4
Созданный столбец - хороший подход для версии MySql, которая составляет 5.7.6 и выше.
Существует два типа генерируемых столбцов:
- Виртуальный (по умолчанию) - столбец будет рассчитываться "на лету", когда
запись считывается из таблицы.
- Сохраненный столбец будет вычисляться, если
новая запись записывается/обновляется в таблице
Оба типа могут иметь NOT NULL-ограничения, но только встроенный Column Column может быть частью индекса.
Чтобы реализовать, я подумал, что оба значения, необходимые для вычисления, представлены в таблице
CREATE TABLE order_details (price DOUBLE, quantity INT, amount DOUBLE AS (price * quantity));
INSERT INTO order_details (price, quantity) VALUES(100,1),(300,4),(60,8);
сумма автоматически появится в таблице, и вы можете получить к ней доступ напрямую, также пожалуйста, что всякий раз, когда вы будете обновлять любой из столбцов, сумма также будет обновлена.
Ответ 5
Если вы хотите добавить столбец в свою таблицу, который автоматически обновляется до половины другого столбца, вы можете сделать это с помощью триггера.
Но я думаю, что уже предложенный ответ - лучший способ сделать это.
Сухой закодированный триггер:
CREATE TRIGGER halfcolumn_insert AFTER INSERT ON table
FOR EACH ROW BEGIN
UPDATE table SET calculated = value / 2 WHERE id = NEW.id;
END;
CREATE TRIGGER halfcolumn_update AFTER UPDATE ON table
FOR EACH ROW BEGIN
UPDATE table SET calculated = value / 2 WHERE id = NEW.id;
END;
Я не думаю, что вы можете сделать только один триггер, так как событие, на которое мы должны ответить, отличается.
Ответ 6
Я надеюсь, что это все равно поможет кому-то, кто может попасть в эту статью. Если вам нужен вычисленный столбец, почему бы просто не разоблачить нужные столбцы в представлении? Не просто сохранять данные или перегружать производительность с помощью триггеров... просто выставляйте нужные вам данные, отформатированные/вычисленные в представлении.
Надеюсь, что это поможет...