【问题标题】:Posgresql is trying to insert into GENERATED ALWAYS columnPostgresql 正在尝试插入 GENERATED ALWAYS 列
【发布时间】:2021-02-26 17:49:35
【问题描述】:

我的表架构:

CREATE TABLE project_sectors(
sector_id int GENERATED ALWAYS AS IDENTITY,
sector_name varchar(256),
project_count int,
PRIMARY KEY (sector_id)
);

我正在尝试对具有某些特定列名的许多表执行查询:

DO $$
DECLARE
t text;
BEGIN
    FOR t IN
        SELECT table_name FROM information_schema.columns WHERE column_name = 'project_name'
    LOOP
        RAISE NOTICE 'INSERT METADATA FOR: %', t;
        EXECUTE 'INSERT INTO project_sectors VALUES ($1, 0)'
        USING t;

    end loop;
end
$$ language 'plpgsql';

一旦我尝试运行我得到的查询:

[42804] 错误:列“sector_id”是整数类型,但表达式是文本类型提示:您需要重写或强制转换表达式。其中:PL/pgSQL function inline_code_block line 9 at EXECUTE

以前的 EXECUTE 语句是

EXECUTE format('INSERT INTO megaproject_sectors VALUES (''%I'', 0)', t)

我会得到错误

错误:整数类型的输入语法无效:“railway”

railway 是 t 的值。

为什么要向 GENERATED ALWAYS 列插入数据?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    为什么要向 GENERATED ALWAYS 列插入数据?

    因为您没有在 INSERT 语句中指定目标列,所以 Postgres 从左到右使用它们。

    始终指定目标列是一种很好的编码习惯。由于您的表名是硬编码的,因此也不需要动态 SQL:

    INSERT INTO project_sectors (sector_name, sector_count) VALUES (t.table_name, 0)
    

    请注意,在其他数据库产品中,指定的值少于表的列数会导致错误。所以在例如Oracle 你的语句会导致“ORA-00947: not enough values”

    【讨论】:

    • 嗯。我知道了。如果我有非常多 (50+) 的列,我还应该指定所有列名吗?
    • 是的,您应该始终指定目标列 - 有这么多列,这一点更加重要。
    猜你喜欢
    • 2021-10-30
    • 2021-11-15
    • 2023-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2017-10-13
    • 2010-11-04
    相关资源
    最近更新 更多