PostgreSQL/pgsql 为表添加列/ 判断列存不存在再添加列

本文介绍了三种在PostgreSQL中向表添加新字段的方法:通用方法、pgsql9.6+版本特有方法及直接添加方法,并提供了具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.通用方法: 
eg:

DO $$
    BEGIN
        BEGIN
            ALTER TABLE dingtalk_corp_info ADD COLUMN admin_id TEXT;
        EXCEPTION
            WHEN duplicate_column THEN RAISE NOTICE 'column admin_id already exists in dingtalk_corp_info.';
        END;
    END;
$$;

2.pgsql 9.6+: 
eg:

ALTER TABLE dingtalk_corp_info ADD COLUMN IF NOT EXISTS admin_id TEXT;

3.直接添加 
eg:

ALTER TABLE dingtalk_corp_info
ADD COLUMN admin_id TEXT;

 

### 如何在 PostgreSQL 中查询的主键 在 PostgreSQL 数据库中,可以通过系统目录 `pg_constraint` 和其他相关视图来查询某个的主键信息。以下是实现这一目标的具体方法。 #### 查询单个的主键 如果需要查询特定的主键名称及其相关信息,可以使用如下 SQL 语句: ```sql SELECT conname AS constraint_name, string_agg(attname, ', ') AS primary_key_columns FROM pg_attribute a JOIN pg_constraint c ON a.attrelid = c.conrelid AND a.attnum = ANY(c.conkey) WHERE c.contype = 'p' -- 主键约束类型 AND a.attrelid = '名'::regclass GROUP BY conname; ``` 此查询通过连接 `pg_attribute` 和 `pg_constraint` ,筛选出指定中的主键,并将其以逗号分隔的形式返回[^1]。 --- #### 批量查询数据库中所有的主键 为了批量获取整个数据库中所有的主键信息,可以扩展上述查询逻辑,去掉针对具体的过滤条件: ```sql SELECT n.nspname AS schema_name, c.relname AS table_name, con.conname AS constraint_name, string_agg(a.attname, ', ') AS primary_key_columns FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_constraint con ON c.oid = con.conrelid JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = ANY(con.conkey) WHERE con.contype = 'p' GROUP BY n.nspname, c.relname, con.conname; ``` 该查询会遍历当前数据库下的所有模式 (`schema`) 及其对应的,提取每张的主键并汇总显示[^1]。 --- #### 处理无主键的情况 当某些未定义主键,在查询过程中可能会遇到异常情况(如错误提示)。为了避免这种情况影响整体查询结果,可以在查询中加入额外判断逻辑,仅处理那些确实设置了主键的。例如: ```sql AND EXISTS ( SELECT 1 FROM pg_constraint sub_con WHERE sub_con.conrelid = c.oid AND sub_con.contype = 'p' ); ``` 这一步骤确保只有具有主键的被纳入最终的结果集中[^2]。 --- #### 获取主键的同附加注释信息 除了主键外,有还需要了解这些字段是否有描述性的注释。为此,可以进一步关联 `pg_description` 视图,从而补充每一的相关说明数据: ```sql LEFT JOIN pg_description d ON d.objoid = c.oid AND d.objsubid = a.attnum ``` 随后将注释内容添加至输出中即可完成需求[^1]。 --- ### 示例代码总结 综合以上各部分功能,完整的解决方案可能如下所示: ```sql SELECT n.nspname AS schema_name, c.relname AS table_name, con.conname AS constraint_name, string_agg(a.attname, ', ') AS primary_key_columns, obj_description(c.oid, 'pg_class') AS table_comment FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_constraint con ON c.oid = con.conrelid JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = ANY(con.conkey) LEFT JOIN pg_description d ON d.objoid = c.oid AND d.objsubid = a.attnum WHERE con.contype = 'p' GROUP BY n.nspname, c.relname, con.conname, obj_description(c.oid, 'pg_class'); ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值