通过只知道模式和表名来删除 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 中的主键约束的主要内容,如果未能解决你的问题,请参考以下文章
在sql中不知道表名,但是知道字段名,怎么根据这个字段名来查询出这张表