Postgres按列名删除约束

时间:2012-10-17 18:56:32

标签: postgresql post

有没有办法可以根据列名删除约束?

我有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)

2 个答案:

答案 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版本我假设当前版本)