我试图在SQL
中通过数据库中的每个表在LOOP中编写一个简单的pgAdmin
查询,并更改指定的列名称。我从来没有在SQL
中编码,但在搜索了很多论坛后,我们设法提出了:
DO
BEGIN
FOR i IN SELECT table_name FROM information_schema.tables
LOOP
IF SELECT column_name FROM information_schema.columns WHERE table_name = 'i.table_name'
THEN
ALTER TABLE i.table_name RENAME COLUMN old_column_name TO new_column_name
END IF;
END LOOP;
答案 0 :(得分:3)
您可以完全跳过information_schema.tables
。只是:
DO
$$
DECLARE
rec record;
BEGIN
FOR rec IN
SELECT table_schema, table_name, column_name
FROM information_schema.columns
WHERE column_name = 'x'
LOOP
EXECUTE format('ALTER TABLE %I.%I RENAME COLUMN %I TO newname;',
rec.table_schema, rec.table_name, rec.column_name);
END LOOP;
END;
$$
LANGUAGE plpgsql;
对'x'
和newname
进行适当的替换。或者将它变成一个将它们作为参数的函数,无论如何。
答案 1 :(得分:0)
您似乎不需要查询tables
,只需查询columns
以查找旧列名称,然后获取它所在的表格。
您需要使用Dynamic SQL进行重命名。
有关如何循环查询结果的信息,请参阅here。这当然需要在PL / pgSQL函数中完成。
答案 2 :(得分:0)
上面发布了您问题的正确答案。或者,如果您尝试简单地从我所有的表中删除一列,那么您可以这样做
DO
$$
DECLARE
rec record;
BEGIN
FOR rec IN
SELECT table_schema, table_name, column_name
FROM information_schema.columns
WHERE column_name = 'my_column_name_to_drop'
LOOP
EXECUTE format('ALTER TABLE %I.%I DROP %I;',
rec.table_schema, rec.table_name, rec.column_name);
END LOOP;
END;
$$
LANGUAGE plpgsql;
my_column_name_to_drop
是您要搜索的实际列。