DROP CONSTRAINT#

레이블에서 제약을 지웁니다.

개요#

DROP CONSTRAINT constraint_name ON label_name

굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.

설명#

DROP CONSTRAINT는 레이블 하나에서 제약 하나를 지웁니다. CREATE CONSTRAINT가 만드는 두 형태 모두를 받습니다. IS UNIQUE 뒤의 배제 제약과, 조건 뒤의 검사 제약입니다. 고유성 제약이 소유한 인덱스도 함께 지웁니다.

이 문장은 의도적으로 작습니다. 이 문장에 없는 것들입니다:

  • 이름이 필수입니다. “이 속성에 걸린 제약이 무엇이든”이라고 말할 방법이 없습니다.

  • IF EXISTS가 없습니다. DROP CONSTRAINT IF EXISTS ...는 구문 오류이므로, 없는 제약은 언제나 오류입니다.

  • CASCADE도 RESTRICT도 없고, 이름 목록도 없습니다.

  • 그 이름은 수식할 수 없고, 레이블 이름도 그렇습니다. 레이블은 graph_path가 지정한 그래프에서 찾습니다.

  • Cypher가 만든 것만이 아니라, 레이블 테이블의 이름 있는 모든 제약에 닿습니다. 레이블의 기본 키도 그중 하나입니다. 실행하기 전에 그 이름을 읽으십시오.

  • 속성 인덱스는 제약이 아닙니다. 그것은 DROP PROPERTY INDEX로 지우십시오.

매개변수#

constraint_name

지울 제약의 이름이며 수식하지 않습니다. \dGv·\dGe·\d가 모두 그것을 보고하고, pg_constraint도 그렇습니다.

label_name

그 제약이 걸린 레이블이며, graph_path가 지정한 그래프 안에서 찾습니다.

예제#

예제는 예제 데이터셋을 쓰지 않고 자체 그래프인 rulebooks를 만들고, 끝에서 그것을 지웁니다.

CREATE GRAPH rulebooks;
SET graph_path = rulebooks;
CREATE VLABEL film;
CREATE CONSTRAINT film_title_uniq ON film ASSERT title IS UNIQUE;
CREATE CONSTRAINT ON film ASSERT year IS UNIQUE;
CREATE VLABEL teen;
CREATE CONSTRAINT teen_age ON teen ASSERT (10 <= age::int AND age::int <= 19);
CREATE CONSTRAINT ON teen ASSERT age > 9;

고유성 제약 지우기#

DROP CONSTRAINT film_title_uniq ON film;
DROP CONSTRAINT

그 제약과 그 인덱스가 둘 다 사라졌습니다. 그 뒤에 만든, 이름 없는 것은 그대로입니다:

\d rulebooks.film
                                                          Table "rulebooks.film"
   Column   |  Type   | Collation | Nullable |                                           Default                                           
------------+---------+-----------+----------+---------------------------------------------------------------------------------------------
 id         | graphid |           | not null | graphid(graph_labid('rulebooks.film'::cstring), nextval('rulebooks.film_id_seq'::regclass))
 properties | jsonb   |           | not null | jsonb_build_object()
Indexes:
    "film_pkey" PRIMARY KEY, btree (id)
    "film_unique_constraint" EXCLUDE USING btree ((properties.'year') WITH =)
Inherits: rulebooks.ag_vertex

두 번째로 실행하면 오류입니다. 그것을 누그러뜨릴 IF EXISTS가 없기 때문입니다:

DROP CONSTRAINT film_title_uniq ON film;
ERROR:  constraint "film_title_uniq" of relation "film" does not exist
DROP CONSTRAINT IF EXISTS film_title_uniq ON film;
ERROR:  syntax error at or near "EXISTS"
LINE 1: DROP CONSTRAINT IF EXISTS film_title_uniq ON film;
                           ^

이름을 붙이지 않은 제약의 이름 찾기#

이름 없이 만든 제약에는 유도된 이름이 붙습니다. pg_constraint가 그 레이블 테이블의 모든 제약을 나열합니다:

SELECT conname FROM pg_constraint WHERE conrelid = 'rulebooks.teen'::regclass ORDER BY conname;
         conname          
--------------------------
 teen_age
 teen_id_not_null
 teen_pkey
 teen_properties_check
 teen_properties_not_null
(5 rows)

teen_age가 이름을 붙인 검사 제약이고 teen_properties_check가 유도된 것입니다. 나머지 셋은 그 레이블 자신의 모양에 속한 것입니다.

검사 제약 지우기#

DROP CONSTRAINT teen_properties_check ON teen;
DROP CONSTRAINT teen_age ON teen;

둘 다 사라졌고, \dGv가 보고할 것이 없다는 것으로 그것을 말해 줍니다:

\dGv rulebooks.teen
          List of labels
   Graph   | Name |  Type  | Owner
-----------+------+--------+-------
 rulebooks | teen | vertex | agens
(1 row)

Vertex label "rulebooks.teen"
--
Inherits: rulebooks.ag_vertex

알아 둘 만한 거부 사례#

속성 인덱스는 이름이 무엇이든 제약이 아닙니다:

CREATE PROPERTY INDEX film_year_idx ON film (year);
DROP CONSTRAINT film_year_idx ON film;
ERROR:  constraint "film_year_idx" of relation "film" does not exist

그리고 그 이름에 그래프를 붙일 수는 없습니다:

DROP CONSTRAINT rulebooks.film_unique_constraint ON film;
ERROR:  syntax error at or near "."
LINE 1: DROP CONSTRAINT rulebooks.film_unique_constraint ON film;
                                 ^

마지막으로 예제가 만든 그래프를 지웁니다:

DROP GRAPH rulebooks CASCADE;

참고#

경고

DROP CONSTRAINT는 레이블 테이블의 이름 있는 모든 제약을 받으며, 레이블의 기본 키도 그중 하나입니다. DROP CONSTRAINT film_pkey ON film은 성공하고, 그 레이블은 id에 대한 기본 키가 없는 상태가 되며, 그것을 되돌려 놓는 문장은 없습니다. 먼저 \dGv나 pg_constraint로 이름을 확인하고, CREATE CONSTRAINT가 만든 이름을 지키십시오.

제약을 바꾸려면 그것을 지우고 다시 만드십시오. CREATE OR REPLACE CONSTRAINT는 거부됩니다.

자식 레이블이 상속한 검사 제약은 그것을 선언한 레이블에서만 지울 수 있습니다:

CREATE GRAPH hierarchy;
SET graph_path = hierarchy;
CREATE VLABEL work;
CREATE CONSTRAINT work_y ON work ASSERT (year::int > 1900);
CREATE VLABEL feature INHERITS (work);

자식을 이름으로 부르면 거부됩니다:

DROP CONSTRAINT work_y ON feature;
ERROR:  cannot drop inherited constraint "work_y" of relation "feature"

부모에서 지우면 계열 전체에서 사라집니다:

DROP CONSTRAINT work_y ON work;
DROP GRAPH hierarchy CASCADE;

호환성#

ISO/IEC 39075 (GQL)#

GQL에는 제약 DDL이 없으므로 이 문장에 대응하는 것이 없습니다. 표준이 그래프를 제약하는 방식은 그래프 타입이고, 그것은 <drop graph type statement>(§12.7)로 통째로 지워집니다. 그래프 타입은 GQL 적합성 표에 계획으로 기록돼 있습니다.

PostgreSQL#

DROP CONSTRAINT ... ON <label>은 ALTER TABLE <table> DROP CONSTRAINT <name>에 대응하며, 레이블 이름이 제약 이름 앞이 아니라 뒤에 옵니다. 제공하는 것은 더 적습니다. IF EXISTS도, CASCADE/RESTRICT도 없고, 한 문장에서 제약 여러 개를 지울 방법도 없습니다. 다만 닿는 범위는 정확히 같습니다. 레이블 테이블의 이름 있는 모든 제약이며, ALTER TABLE이 닿는 것과 같은 집합입니다.

관련 항목#