Postgresql 向数据库中还没有主键的所有表添加主键 原始问题

Postgresql 向数据库中还没有主键的所有表添加主键 原始问题,postgresql,postgis,plpgsql,Postgresql,Postgis,Plpgsql,在我的PostgreSQL数据库中,我有大约400个表,这些表目前缺少主键,这在不同的应用程序中会导致许多问题 我现在想解决这个问题。我不想重复以下400次: ALTER TABLE\ U schema.TABLE\ U name添加列ID序列主键; 相反,我找到了一种方法来查找当前没有任何主键的所有表: 选择tab.table\u模式,tab.table\u名称 从信息\u schema.tables选项卡 左连接信息\u schema.table\u约束tco 在tab.table_sche

在我的PostgreSQL数据库中,我有大约400个表,这些表目前缺少主键,这在不同的应用程序中会导致许多问题

我现在想解决这个问题。我不想重复以下400次:

ALTER TABLE\ U schema.TABLE\ U name添加列ID序列主键; 相反,我找到了一种方法来查找当前没有任何主键的所有表:

选择tab.table\u模式,tab.table\u名称 从信息\u schema.tables选项卡 左连接信息\u schema.table\u约束tco 在tab.table_schema=tco.table_schema上 和tab.table_name=tco.table_name 和tco.constraint_type='PRIMARY KEY' 其中tab.table_type='BASE table' 和tab.table_架构不在“pg_目录”、“信息_架构”中 并且tco.constraint\u名称为空 按表顺序\u模式, 表名称 这会导致如下结果:

[table_schema]  [table_name]
"abc"           "grid_100m_20151127"
"abc"           "grid_100m_20190220"

... plus 400 more rows
问题:如何组合这两个查询,以便在ALTER查询中使用SELECT查询的结果

完全解 @JimJones在下面的回答中得出了以下解决方案:

做$$ 申报行记录; 开始 划船 选择tab.table\u模式,tab.table\u名称 从信息\u schema.tables选项卡 左连接信息\u schema.table\u约束tco 在tab.table_schema=tco.table_schema上 和tab.table_name=tco.table_name 和tco.constraint_type='PRIMARY KEY' 其中tab.table_type='BASE table' 和tab.table_架构不在“pg_目录”、“信息_架构”中 并且tco.constraint\u名称为空 按表\模式、表\名称排序 环 执行'ALTER TABLE'| | row.TABLE| | |'。| | row.TABLE|U name | |'ADD COLUMN PRIMARY|U KEY SERIAL PRIMARY KEY'; 端环; 终止 $$; 非常感谢你帮我解决这个问题

您是否尝试过在内部使用循环

将查询放在FOR行和循环之间

我曾在一次会议上处理过类似的问题

编辑:@filiprem建议的以下语法看起来也非常简洁:

EXECUTE format('ALTER TABLE %I.%I ADD id serial PRIMARY KEY', table_schema, table_name);
略微改进:执行格式“ALTER TABLE%I.%I ADD id serial PRIMARY KEY”、TABLE_架构、TABLE_名称;
EXECUTE format('ALTER TABLE %I.%I ADD id serial PRIMARY KEY', table_schema, table_name);