SQL:添加从其他列生成的列时出错(postgresql 11)

SQL:添加从其他列生成的列时出错(postgresql 11),sql,postgresql,generated,Sql,Postgresql,Generated,我尝试在我的表格中添加一列,该列引用BMI,我已经有两列包含身高和体重。我想在填写其他两列时自动生成此列。但是我遇到了一个错误,我没有找到任何解决它的答案 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)^

我尝试在我的表格中添加一列,该列引用BMI,我已经有两列包含身高和体重。我想在填写其他两列时自动生成此列。但是我遇到了一个错误,我没有找到任何解决它的答案

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
该语法用于而不是PostgreSQL:

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

一般来说,每个DBMS都使用自己的SQL方言,但往往存在很大差异。除了非常基本的DML语句,您必须坚持使用产品的文档。

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;

Postgres(尚未)支持计算列。为什么要存储BMI而不是在选择/视图中计算它?如果需要索引,可以使用表达式索引