SQL: ошибка при добавлении столбца, созданного из других столбцов (postgresql 11) - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь добавить столбец в мою таблицу, который ссылается на ИМТ, и у меня уже есть 2 столбца с ростом и весом.Я хочу автоматически создать этот столбец, когда я заполняю 2 других.Но я получаю сообщение об ошибке и не могу найти ответ, чтобы решить ее.

CREATE TABLE player
(
    id INT PRIMARY KEY NOT NULL,
    height INT,
    weight INT
);

ALTER TABLE player ADD COLUMN bmi FLOAT GENERATED ALWAYS AS (weight/((height/100)^2)) STORED;

Я получаю следующую ошибку:

ERROR: syntax error at or near "(" 
LINE : ...E player ADD COLUMN bmi FLOAT GENERATED ALWAYS AS (weight/((h...

SQL state: 42601 Character: 61

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

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

CREATE TRIGGER tr_player_computed
AFTER INSERT OR UPDATE OR DELETE ON emp
    FOR EACH ROW EXECUTE PROCEDURE f_tr_player_computed();

CREATE OR REPLACE FUNCTION f_tr_player_computed() RETURNS TRIGGER AS $player$
   BEGIN
      new.bmi = (new.weight/((new.height/100)^2));
      RETURN NEW;
   END;
0 голосов
/ 16 февраля 2019

Этот синтаксис предназначен для MySQL , а не PostgreSQL:

col_name data_type [GENERATED ALWAYS] AS (expr)
  [VIRTUAL | STORED] [NOT NULL | NULL]
  [UNIQUE [KEY]] [[PRIMARY] KEY]
  [COMMENT 'string']

В общем, каждая СУБД говорит на своем собственном диалекте SQL, часто с большими различиями.За исключением самых простых инструкций DML, вы должны придерживаться документации продукта, который вы используете.

...