DROP CONSTRAINT#
레이블에서 제약을 지웁니다.
개요#
굵게 키워드 · 기울임 직접 채우는 자리 · [ ] 생략 가능 · ... 반복 가능. 구문 표기 규약을 참고하십시오.
설명#
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이 닿는 것과 같은
집합입니다.