Подтвердить что ты не робот

Колонка рассчитана из другого столбца?

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

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

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

Результат:

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

Ответ 1

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

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

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

UPDATE mytable SET calculated = value/2;

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

Ответ 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

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

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