postgresql INSERT INTO表中的所有列



我正在尝试编写一个方法,从表中删除重复项,而不必知道表的一般细节(即,它应该在任何表上运行)。

我从这里使用以下方法(最后一种方法)通过psycopg2:

CREATE TABLE tempTable (LIKE "{table}");
INSERT INTO tempTable(*)
SELECT
DISTINCT ON ("{column}") *
FROM "{table}";
DROP TABLE "{table}";
ALTER TABLE tempTable
RENAME TO "{table}";
DROP table tempTable

问题是您不能使用*来获取INSERT INTO命令中的所有列。我们期望指定要插入的所有列的列表,这可能有利于控制,但不利于我在这里的目的。

我知道我可以用

获取表的列名列表
SELECT column_name FROM information_schema.columns WHERE table_name = "{table}"

但是我不能把它作为*的子查询。

对这个8年前的问题的回答表明,这在SQL中是不可能的。这可能是真的,也可能不是真的。

现在可以做吗?

你的链接指向MySQL数据库,在PostgreSQL是完全有效的使用insert没有列列表

INSERT INTO tempTable 
SELECT
DISTINCT ON (a) *
FROM t;

不是最佳实践(因为如果列顺序突然不像预期的那样,这可能会导致问题),但是对于使用源表的like创建目标表的用例来说,这是可行的。

附加两点

  • 您可能需要在select distinct中添加order by以启用确定性结果(哪些重复的行将被删除并保留)。

  • 最后的DROP table tempTable放错了位置,因为这个表不再存在,因为在前面的语句中被重命名为