2012-10-17 3 views
1

열 이름을 기반으로 제약 조건을 제거 할 수있는 방법이 있습니까?Postgres가 열 이름으로 제약 조건을 제거합니다

나는 postgres가 8.4이고 프로젝트를 업그레이드 할 때 제약 조건이 다른 버전에서 다른 이름이 지정 되었기 때문에 업그레이드가 실패합니다.

기본적으로 제약 조건이있는 경우 제거해야하거나 열 이름을 사용하여 제약 조건을 제거 할 수 있습니다.

제약 조건의 이름이 변경된 유일한 것입니다. 그게 가능하다면 어떤 생각? 이 경우

, 나는 당신이 제약 시합 정보를 찾을 수 System Catalogs을 사용할 수 있습니다

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

어떤 종류의 (당신은 내가 현재 버전을 믿고있어 당신의 PostgreSQL의 버전을 지정하지 않은 것처럼)? 외래 키? 제약 조건을 확인 하시겠습니까? Null이 아닌가? –

+0

원래 게시물을 편집했습니다. –

답변

1

, 그 제약 조건을 제거하려면 다음 SQL 문을 사용할 수 있습니다 "고유 제한 조건 대신 고유 색인이 추가되었습니다.

2 열 이상인 경우 having count(*) = 2 부분을 column_name in .. 조건의 열 수와 일치하도록 조정해야합니다.

제약의

1

을 "patron_username_key"을 제거해야합니다. 키와 같은 일부 제약 조건은 별도의 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 ... 문을 구성 할 수 있습니다. 당신은 단지 "가있는 경우이 작동하는지

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; 
$$ 

잘 모르겠어요 : 고유 인덱스가 고유 제한 조건을 추가하는 결과라고 가정

관련 문제