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

时间:2015-04-10 04:47:05

标签: postgresql insert

这是我的插入查询:

    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。

2 个答案:

答案 0 :(得分:0)

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表中带有lissting_id=9656的值插入表listing_replica_child

只需致电

select insert_listing_replica_child (9656)

答案 1 :(得分:0)

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

您的尝试将成为:

INSERT INTO listing_replica_child
SELECT * FROM listing
WHERE listing_id = 9656

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

即使你曾要求*不被使用,这也是实现任务的最简单,最好的方法。