1

有没有办法可以删除基于列名的约束?

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

2 回答 2

2

您可以使用系统目录来查找有关约束的信息。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 ...语句的那些。

于 2012-10-17T19:17:20.470 回答
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 版本,我假设是当前版本)

于 2012-10-17T19:27:04.010 回答