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

Tek*_*row 2 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;
Run Code Online (Sandbox Code Playgroud)

所需结果;

     name     |   username
--------------+--------------
 el duderino  | el duderino
Run Code Online (Sandbox Code Playgroud)

insert语句运行但由于以下错误而无法建立表,因此找不到该表...

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

是否可以在一行的默认语句中引用值的名字?还是必须分阶段进行?任何帮助,不胜感激!

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

Ade*_*lip 13

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

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

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


Dar*_*sli 12

Postgres 12 现在具有生成的列

CREATE TABLE members (
    name varchar(50) NOT NULL,
    username varchar(50) GENERATED ALWAYS AS (name) STORED
);
Run Code Online (Sandbox Code Playgroud)

  • 请记住,您无法直接编辑生成列的值。UPDATE 成员 SET username = 'el_duderino' WHERE username = 'el duderino' 将不起作用 (3认同)

Gur*_*ngh 5

您可以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;
Run Code Online (Sandbox Code Playgroud)

调用触发器:

create trigger trig_insert_members_username
before insert
on members
for each row
execute procedure insert_members_username();
Run Code Online (Sandbox Code Playgroud)

演示版