据我所知,在postgresql中删除主键的唯一方法是
ALTER TABLE schema.tableName DROP CONSTRAINT constraint_name;
默认情况下,约束名称为tableName_pkey 但有时如果表已经重命名,我就无法获得原始表名来构造正确的约束名。
例如,创建为A的表然后重命名为B,约束仍为A_pkey,但我只有B.
您是否知道通过仅了解模式名称和表名来放弃pkey约束的正确方法?
我正在编写程序来执行此操作,因此我只需要使用SQL查询。像“打开pgAdmin并查看约束名称”这样的解决方案将无效。
答案 0 :(得分:10)
您可以使用目录表中的信息,如下所示:
创建一个以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
。
答案 1 :(得分: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。
否则,从系统目录中选择的另一个答案是可行的方法。