如何通过声明所有字段(不是 *)来插入数据?

how can I insert data by declaring all fields (not *)?

这是我的插入查询:

    INSERT INTO listing_replica_child (
     (
      SELECT rtz_comma_list(column_name)
      FROM information_schema.columns
      WHERE table_name = 'listing'
     )
    )
VALUES (
    (
        SELECT (
               (
                SELECT rtz_comma_list(column_name)
                FROM information_schema.columns
                WHERE table_name = 'listing'
               ) 
                FROM listing
                WHERE listing_id = 9656
               )
        )
    );

我正在使用 postgres。

do $$
DECLARE rec TEXT;
BEGIN
    SELECT 'insert into listing_replica_child (' || t.col || ') select * from listing WHERE listing_id = 9656 '
    INTO rec
    FROM (
        SELECT string_agg(column_name, ',') col
        FROM information_schema.columns
        WHERE table_name = 'listing'
        ) t;

    EXECUTE rec;
END;$$;

您可以将此动态查询包装成这样的函数

CREATE OR replace FUNCTION insert_listing_replica_child (_listing_id INT)
RETURNS void AS $$
DECLARE rec TEXT;
BEGIN
    SELECT 'insert into listing_replica_child (' || t.col || ') select * from listing WHERE listing_id = ' || _listing_id || ' '
    INTO rec
    FROM (
        SELECT string_agg(column_name, ',') col
        FROM information_schema.columns
        WHERE table_name = 'listing'
        ) t;

    EXECUTE rec;
END $$
LANGUAGE plpgsql

因此,如果要将 listing table 和 lissting_id=9656 的值插入 table listing_replica_child

直接打电话

select insert_listing_replica_child (9656)

指定所有目标字段的方法是完全省略列列表。

您的尝试将变为:

INSERT INTO listing_replica_child
SELECT * FROM listing
WHERE listing_id = 9656

无意间:如果表字段的数量和类型与您的尝试不同,执行将爆炸(此查询也是如此)。

虽然你要求*不被使用,但它是完成任务的最简单和最好的方法。