有没有办法可以根据列名删除约束?
我有postgres 8.4,当我升级我的项目时,升级失败,因为在不同的版本中,约束被命名为不同的东西。
基本上,我需要删除约束(如果存在)或者我可以使用列名删除约束。
约束的名称是唯一已更改的内容。不知道是否有可能吗?
在这种情况下,我需要删除“patron_username_key”
discovery=# \d patron
Table "public.patron"
Column | Type | Modifiers
--------------------------+-----------------------------+-----------
patron_id | integer | not null
create_date | timestamp without time zone | not null
row_version | integer | not null
display_name | character varying(255) | not null
username | character varying(255) | not null
authentication_server_id | integer |
Indexes:
"patron_pkey" PRIMARY KEY, btree (patron_id)
"patron_username_key" UNIQUE, btree (username, authentication_server_id)
答案 0 :(得分:1)
您可以使用System Catalogs查找约束信息。但是,在单独的pg_constraint
表中提到了一些约束(如键),而其他约束(如NOT NULL
)基本上是pg_attribute
表中的列。
对于键,您可以使用此查询来获取约束定义列表:
SELECT pg_get_constraintdef(c.oid) AS def
FROM pg_class t
JOIN pg_constraint c ON c.conrelid=t.oid
WHERE t.relkind='r' AND t.relname = 'table';
然后,您可以过滤掉引用您的列的动态并动态构建ALTER TABLE ... DROP CONSTRAINT ...
语句。
答案 1 :(得分:1)
假设唯一索引是添加唯一约束的结果,您可以使用以下SQL语句删除该约束:
do $$
declare
cons_name text;
begin
select constraint_name
into cons_name
from information_schema.constraint_column_usage
where constraint_schema = current_schema()
and column_name in ('authentication_server_id', 'username')
and table_name = 'patron'
group by constraint_name
having count(*) = 2;
execute 'alter table patron drop constraint '||cons_name;
end;
$$
如果您“仅”添加了唯一索引(而不是唯一约束),我不确定这是否有效。
如果您需要对超过2列进行此操作,则还需要调整having count(*) = 2
部分以匹配column_name in ..
条件中的列数。
(因为你没有指定你的PostgreSQL版本我假设当前版本)