{#drop-constraint-drop-constraint}
# DROP CONSTRAINT
레이블에서 제약을 지웁니다.
{#drop-constraint-synopsis}
## 개요
DROP CONSTRAINTconstraint_nameONlabel_name
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
{#drop-constraint-description}
## 설명
`DROP CONSTRAINT`는 레이블 하나에서 제약 하나를 지웁니다.
[`CREATE CONSTRAINT`](create-constraint.md)가 만드는 두 형태 모두를 받습니다. `IS UNIQUE` 뒤의 배제
제약과, 조건 뒤의 검사 제약입니다. 고유성 제약이 소유한 인덱스도 함께 지웁니다.
이 문장은 의도적으로 작습니다. 이 문장에 없는 것들입니다:
- **이름이 필수입니다.** "이 속성에 걸린 제약이 무엇이든"이라고 말할 방법이 없습니다.
- **`IF EXISTS`가 없습니다.** `DROP CONSTRAINT IF EXISTS ...`는 구문 오류이므로, 없는 제약은 언제나
오류입니다.
- **`CASCADE`도 `RESTRICT`도 없고,** 이름 목록도 없습니다.
- 그 이름은 수식할 수 없고, 레이블 이름도 그렇습니다. 레이블은 `graph_path`가 지정한 그래프에서
찾습니다.
- Cypher가 만든 것만이 아니라, 레이블 테이블의 이름 있는 모든 제약에 닿습니다. 레이블의 기본 키도
그중 하나입니다. 실행하기 전에 그 이름을 읽으십시오.
- 속성 인덱스는 제약이 아닙니다. 그것은 [`DROP PROPERTY INDEX`](drop-property-index.md)로
지우십시오.
{#drop-constraint-parameters}
## 매개변수
constraint_name
: 지울 제약의 이름이며 수식하지 않습니다. `\dGv`·`\dGe`·`\d`가 모두 그것을 보고하고,
`pg_constraint`도 그렇습니다.
label_name
: 그 제약이 걸린 레이블이며, `graph_path`가 지정한 그래프 안에서 찾습니다.
{#drop-constraint-examples}
## 예제
예제는 [예제 데이터셋](../../get_started/example-dataset.md)을 쓰지 않고 자체 그래프인
`rulebooks`를 만들고, 끝에서 그것을 지웁니다.
```cypher
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-drop-a-unique-constraint}
### 고유성 제약 지우기
```cypher
DROP CONSTRAINT film_title_uniq ON film;
```
```
DROP CONSTRAINT
```
그 제약과 그 인덱스가 둘 다 사라졌습니다. 그 뒤에 만든, 이름 없는 것은 그대로입니다:
```psql
\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`가 없기 때문입니다:
```cypher
DROP CONSTRAINT film_title_uniq ON film;
```
```
ERROR: constraint "film_title_uniq" of relation "film" does not exist
```
```cypher
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;
^
```
{#drop-constraint-find-the-name-of-a-constraint-you-did-not-name}
### 이름을 붙이지 않은 제약의 이름 찾기
이름 없이 만든 제약에는 유도된 이름이 붙습니다. `pg_constraint`가 그 레이블 테이블의 모든 제약을
나열합니다:
```sql
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-drop-a-check-constraint}
### 검사 제약 지우기
```cypher
DROP CONSTRAINT teen_properties_check ON teen;
DROP CONSTRAINT teen_age ON teen;
```
둘 다 사라졌고, `\dGv`가 보고할 것이 없다는 것으로 그것을 말해 줍니다:
```psql
\dGv rulebooks.teen
```
```
List of labels
Graph | Name | Type | Owner
-----------+------+--------+-------
rulebooks | teen | vertex | agens
(1 row)
Vertex label "rulebooks.teen"
--
Inherits: rulebooks.ag_vertex
```
{#drop-constraint-refusals-worth-recognizing}
### 알아 둘 만한 거부 사례
속성 인덱스는 이름이 무엇이든 제약이 아닙니다:
```cypher
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
```
그리고 그 이름에 그래프를 붙일 수는 없습니다:
```cypher
DROP CONSTRAINT rulebooks.film_unique_constraint ON film;
```
```
ERROR: syntax error at or near "."
LINE 1: DROP CONSTRAINT rulebooks.film_unique_constraint ON film;
^
```
마지막으로 예제가 만든 그래프를 지웁니다:
```cypher
DROP GRAPH rulebooks CASCADE;
```
{#drop-constraint-notes}
## 참고
```{warning}
`DROP CONSTRAINT`는 레이블 테이블의 이름 있는 모든 제약을 받으며, 레이블의 기본 키도 그중
하나입니다. `DROP CONSTRAINT film_pkey ON film`은 성공하고, 그 레이블은 `id`에 대한 기본 키가 없는
상태가 되며, 그것을 되돌려 놓는 문장은 없습니다. 먼저 `\dGv`나 `pg_constraint`로 이름을 확인하고,
[`CREATE CONSTRAINT`](create-constraint.md)가 만든 이름을 지키십시오.
```
제약을 바꾸려면 그것을 지우고 다시 만드십시오. `CREATE OR REPLACE CONSTRAINT`는 거부됩니다.
자식 레이블이 상속한 검사 제약은 그것을 선언한 레이블에서만 지울 수 있습니다:
```cypher
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);
```
자식을 이름으로 부르면 거부됩니다:
```cypher
DROP CONSTRAINT work_y ON feature;
```
```
ERROR: cannot drop inherited constraint "work_y" of relation "feature"
```
부모에서 지우면 계열 전체에서 사라집니다:
```cypher
DROP CONSTRAINT work_y ON work;
DROP GRAPH hierarchy CASCADE;
```
{#drop-constraint-compatibility}
## 호환성
{#drop-constraint-isoiec-39075-gql}
### ISO/IEC 39075 (GQL)
GQL에는 제약 DDL이 없으므로 이 문장에 대응하는 것이 없습니다. 표준이 그래프를 제약하는 방식은
그래프 타입이고, 그것은 ``(§12.7)로 통째로 지워집니다. 그래프 타입은
[GQL 적합성 표](../../appendix/gql-conformance.md)에 계획으로 기록돼 있습니다.
{#drop-constraint-postgresql}
### PostgreSQL
`DROP CONSTRAINT ... ON