SQL:是否可以将列值输入用作同一insert语句中另一列的默认值?

时间:2017-04-03 17:18:14

标签: sql postgresql sql-insert

我想知道是否可以将列输入值重新用作另一个列值输入的默认值(如果它留空)。我试图在DEFAULT代码之后简单地填充引用。

CREATE TABLE members (
    name varchar(50) NOT NULL,
    username varchar(50) DEFAULT name
    );

INSERT INTO members (name) VALUES ('el duderino');
SELECT * FROM members;

期望的结果;

     name     |   username
--------------+--------------
 el duderino  | el duderino

insert语句运行但找不到表,因为它没有因为以下错误而构建...

  

psql:website.sql:38:错误:无法在默认表达式中使用列引用

是否可以在一行中引用默认语句中的值first name?或者这必须分阶段完成吗?任何帮助非常感谢!

注意:我在Cloud 9开发机器上运行Postgresql。

3 个答案:

答案 0 :(得分:4)

您可以为此创建TRIGGER

要调用的函数:

create or replace function insert_members_username() returns trigger as $$
begin
    if NEW.username is null then
        NEW.username := NEW.name;
    end if;
    return new;
end;
$$ language plpgsql;

致电触发器:

create trigger trig_insert_members_username
before insert
on members
for each row
execute procedure insert_members_username();

Demo

答案 1 :(得分:4)

Postgres 12现在具有Generated Columns

CREATE TABLE members (
    name varchar(50) NOT NULL,
    username varchar(50) GENERATED ALWAYS AS (name) STORED
);

答案 2 :(得分:3)

如果您在 Postgres 中设置默认值时遇到类似的错误。例如:

<块引用>

错误:无法在 DEFAULT 表达式第 6 行中使用列引用: is_used boolean DEFAULT 否,

解决方案是将默认值放在单引号中;