Столбец рассчитывается из другого столбца? - PullRequest
56 голосов
/ 07 марта 2011

Учитывая следующую таблицу:

id | value
--------------
1     6
2     70

Есть ли способ добавить столбец, который автоматически рассчитывается на основе другого столбца в той же таблице?Как ВИД, но часть той же таблицы.Например, calculated будет половиной value.Calculated должно автоматически обновляться при изменении value, точно так же, как будет VIEW.

Результат будет:

id | value | calculated
-----------------------
1     6       3
2     70      35

Ответы [ 7 ]

55 голосов
/ 05 марта 2016

Сгенерированный столбец - один из подходов для версии MySql версии 5.7.6 и выше.

Существует два вида сгенерированных столбцов:

  • Виртуальный (по умолчанию) - столбец будет вычислен на лету при чтении записи из таблицы
  • Сохранено- столбец будет вычисляться при записи / обновлении новой записи в таблице

Оба типа могут иметь ограничения NOT NULL, но только сохраненный сгенерированный столбец может быть частью индекса.

Для текущего случая мы будем использовать сохраненный сгенерированный столбец.Для реализации я считал, что оба значения, необходимые для расчета, присутствуют в таблице

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);

сумма автоматически появится в таблице, и вы можете получить к ней доступ напрямую, также обратите внимание, что при каждом обновлении любого изстолбцы, сумма также будет обновляться.

32 голосов
/ 07 марта 2011

Если это выбор, вы можете сделать это как:

SELECT id, value, (value/2) AS calculated FROM mytable

Иначе, вы также можете сначала изменить таблицу, чтобы добавить отсутствующий столбец, а затем выполнить запрос UPDATE, чтобы вычислить значения для нового столбца следующим образом:

UPDATE mytable SET calculated = value/2;

Если это должно быть автоматическим, и ваша версия MySQL это позволяет, вы можете попробовать с помощью триггеров

24 голосов
/ 30 марта 2015

MySQL 5.7 поддерживает вычисляемые столбцы. Они называют его «Сгенерированные столбцы», и синтаксис немного странный, но он поддерживает те же параметры, которые я вижу в других базах данных.

https://dev.mysql.com/doc/refman/5.7/en/create-table.html#create-table-generated-columns

21 голосов
/ 20 сентября 2011

@ krtek ответ в правильном направлении, но имеет несколько проблем.

Плохая новость заключается в том, что использование UPDATE в триггере на той же таблице не будет работать.Хорошей новостью является то, что в этом нет необходимости;есть НОВЫЙ объект, с которым вы можете работать еще до того, как к столу дотронулись.

Триггер становится:

CREATE TRIGGER halfcolumn_update BEFORE UPDATE ON my_table
  FOR EACH ROW BEGIN
    SET NEW.calculated = NEW.value/2;
  END;

Обратите внимание, что BEGIN ... END;синтаксис должен быть проанализирован с другим действующим разделителем.Весь шебанг становится:

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 голосов
/ 07 марта 2011

Если вы хотите добавить в таблицу столбец, который автоматически обновляется до половины другого столбца, вы можете сделать это с помощью триггера.

Но я думаю, что уже предложенный ответ - лучший способ сделать это.

Сухой кодированный триггер:

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;

Я не думаю, что вы можете сделать только один триггер, поскольку событие, на которое мы должны ответить, отличается.

3 голосов
/ 20 декабря 2016

Я надеюсь, что это все равно поможет кому-то, так как многие люди могут получить эту статью.Если вам нужен вычисляемый столбец, почему бы просто не предоставить нужные столбцы в представлении?Не просто сохраняйте данные или перегружайте производительность с помощью триггеров ... просто предоставьте данные, которые вам нужны, уже отформатированы / рассчитаны в представлении.

Надеюсь, это поможет ...

1 голос
/ 12 февраля 2019

Вы можете использовать сгенерированные столбцы из MYSQL 5.7.

Пример использования:

ALTER TABLE tbl_test
ADD COLUMN calc_val INT 
GENERATED ALWAYS AS (((`column1` - 1) * 16) + `column2`) STORED;

VIRTUAL / STORED

  • Виртуальный: вычисляется на лету, когда запись читается из таблицы (по умолчанию)
  • Сохранено: рассчитывается при добавлении / обновлении новой записи в таблица
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...