SQL:添加从其他列生成的列时出错(postgresql 11)
我尝试在我的表格中添加一列,该列引用BMI,我已经有两列包含身高和体重。我想在填写其他两列时自动生成此列。但是我遇到了一个错误,我没有找到任何解决它的答案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)^
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而不是在选择/视图中计算它?如果需要索引,可以使用表达式索引