如何通过声明所有字段(不是 *)来插入数据?
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
无意间:如果表字段的数量和类型与您的尝试不同,执行将爆炸(此查询也是如此)。
虽然你要求*
不被使用,但它是完成任务的最简单和最好的方法。
这是我的插入查询:
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
无意间:如果表字段的数量和类型与您的尝试不同,执行将爆炸(此查询也是如此)。
虽然你要求*
不被使用,但它是完成任务的最简单和最好的方法。