通过只知道模式和表名来删除 postgresql 中的主键约束

Posted

技术标签:

【中文标题】通过只知道模式和表名来删除 postgresql 中的主键约束【英文标题】:drop primary key constraint in postgresql by knowing schema and table name only 【发布时间】:2017-12-24 16:50:10 【问题描述】:

据我所知,在 postgresql 中删除主键的唯一方法是:

ALTER TABLE schema.tableName DROP CONSTRAINT constraint_name;

默认的约束名称是tableName_pkey。但是有时如果表已经重命名,我无法获取原始表名来构造正确的约束名。

例如,对于创建为A 然后重命名为B 的表,约束仍然是A_pkey,但我只有表名B

你知道通过只知道模式名和表名来删除 pkey 约束的正确方法吗?

我正在为此编写程序,因此我只需要使用 SQL 查询。 “打开 pgAdmin 并查看约束名称”之类的解决方案将不起作用。

【问题讨论】:

【参考方案1】:

您可以像这样使用目录表中的信息:

创建以id为主键的表

create table test1 (id int primary key, name text);

创建删除密钥的 SQL

select concat('alter table public.test1 drop constraint ', constraint_name) as my_query
from information_schema.table_constraints
where table_schema = 'public'
      and table_name = 'test1'
      and constraint_type = 'PRIMARY KEY';

结果将是:

alter table public.test1 drop constraint test1_pkey

您可以创建一个存储函数来提取此查询,然后execute 它。

【讨论】:

我使用了上面的内容并换掉了 concat 以使其更具动态性...SELECT 'ALTER TABLE ' || table_schema || '.' || table_name || ' DROP CONSTRAINT ' || constraint_name AS my_query 非常好@rjchicago。感谢分享。 @zedfoxus 很有帮助,感谢分享【参考方案2】:

使用命令行工具 psql 登录数据库。

然后输入:

\d <table_name>

例如:

\d claim
                                                  Table "public.claim"
             Column             |            Type             | Collation | Nullable |              Default              
--------------------------------+-----------------------------+-----------+----------+-----------------------------------
 id                             | integer                     |           | not null | nextval('claim_id_seq'::regclass)
 policy_id                      | integer                     |           |          | 
 person_id                      | integer                     |           |          | 
 incident_id                    | integer                     |           |          | 
 first_notification_of_loss     | timestamp without time zone |           |          | 
 police_reference               | character varying(40)       |           |          | 
 photos_to_follow               | boolean                     |           |          | 
 sketch_to_follow               | boolean                     |           |          | 
 description_of_weather         | character varying(2000)     |           |          | 
 description_of_property_damage | character varying(2000)     |           |          | 
 created_at                     | timestamp without time zone |           | not null | now()
 updated_at                     | timestamp without time zone |           | not null | 
Indexes:
    "primary_key_claim" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "foreign_key_claim_incident" FOREIGN KEY (incident_id) REFERENCES incident(id)
    "foreign_key_claim_person" FOREIGN KEY (person_id) REFERENCES person(id)
    "foreign_key_claim_policy" FOREIGN KEY (policy_id) REFERENCES policy(id)
Referenced by:
    TABLE "claimant" CONSTRAINT "foreign_key_claimant_claim" FOREIGN KEY (claim_id) REFERENCES claim(id)
    TABLE "damage" CONSTRAINT "foreign_key_damage_claim" FOREIGN KEY (claim_id) REFERENCES claim(id)
    TABLE "witness" CONSTRAINT "foreign_key_witness_claim" FOREIGN KEY (claim_id) REFERENCES claim(id)

这会显示主键名称(以及其他内容)。

如果您想以编程方式执行此操作,并且您正在使用 Java 或其他使用 JDBC 接口的语言,则可以使用类 DatabaseMetaData,方法 getPrimaryKeys。

否则,从系统目录中选择另一个答案是可行的方法。

【讨论】:

谢谢,但我需要以编程方式执行此操作。我正在编写程序删除用户指定表名的主键。 换句话说,我只需要使用 SQL 查询来做到这一点

以上是关于通过只知道模式和表名来删除 postgresql 中的主键约束的主要内容,如果未能解决你的问题,请参考以下文章

怎样设置PostgreSQL中字段和表名对大小写敏感

怎样设置PostgreSQL中字段和表名对大小写敏感

ado.NET 通过字段和表名从数据读取器获取字段

在sql中不知道表名,但是知道字段名,怎么根据这个字段名来查询出这张表

如何使用 init.sql 在 Postgresql 中创建数据库、模式和表

如何在 Oracle 中动态分析给定模式名和表名的元数据?