DBAtlas · 데이터베이스 운영 아틀라스

제약 조건 추가 또는 비활성화(FK/CHECK/UNIQUE)

Oracle

-- Add a foreign key
ALTER TABLE orders ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customer(id);
-- CHECK
ALTER TABLE product ADD CONSTRAINT chk_price CHECK (price >= 0);
-- Disable / enable
ALTER TABLE orders DISABLE CONSTRAINT fk_customer;
ALTER TABLE orders ENABLE CONSTRAINT fk_customer;

Oracle 제약 조건은 DISABLE/ENABLE로 일시적으로 끌 수 있다(대량 적재에 유용). ENABLE VALIDATE는 기존 행을 검사하고, NOVALIDATE는 검사하지 않는다.

PostgreSQL

-- Foreign key and CHECK
ALTER TABLE orders ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customer(id);
ALTER TABLE product ADD CONSTRAINT chk_price CHECK (price >= 0);

-- Instead of disabling the FK: NOT VALID + validate later
ALTER TABLE orders ADD CONSTRAINT fk2 FOREIGN KEY (c_id) REFERENCES customer(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT fk2;
ALTER TABLE orders DROP CONSTRAINT fk2;

PostgreSQL에는 제약 조건 DISABLE이 없다. 대형 테이블에서 락을 줄이려면 NOT VALID로 제약 조건을 추가하고 나중에 VALIDATE한다. ALTER TABLE ... DISABLE TRIGGER ALL은 FK의 내부 트리거도 비활성화하며 superuser가 필요하다. 꺼진 동안 삽입된 데이터는 검증되지 않고, 다시 활성화해도 소급 검사하지 않는다(무결성이 조용히 깨질 위험). 대신 제약 조건을 DROP하고 NOT VALID로 다시 추가한 뒤 VALIDATE CONSTRAINT를 실행한다.

MySQL

-- Foreign key and CHECK
ALTER TABLE orders ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customer(id);
ALTER TABLE product ADD CONSTRAINT chk_price CHECK (price >= 0);

-- Temporarily disable FK checks for the session
SET FOREIGN_KEY_CHECKS = 0;
-- ... bulk operation ...
SET FOREIGN_KEY_CHECKS = 1;

InnoDB가 필요하다. 개별 제약 조건을 비활성화하는 대신 세션 수준의 SET FOREIGN_KEY_CHECKS=0을 사용한다. CHECK 제약 조건은 MySQL 8.0.16부터 실제로 적용된다(이전에는 무시됨).

SQL Server

-- Foreign key and CHECK
ALTER TABLE orders ADD CONSTRAINT fk_customer FOREIGN KEY (customer_id) REFERENCES customer(id);
ALTER TABLE product ADD CONSTRAINT chk_price CHECK (price >= 0);

-- Disable / re-enable (validate with WITH CHECK)
ALTER TABLE orders NOCHECK CONSTRAINT fk_customer;
ALTER TABLE orders WITH CHECK CHECK CONSTRAINT fk_customer;

SQL Server에서 FK/CHECK 제약 조건은 NOCHECK CONSTRAINT로 비활성화한다. 다시 활성화할 때 WITH CHECK CHECK CONSTRAINT를 사용하지 않으면 제약 조건이 'not trusted' 상태로 남아 쿼리 옵티마이저가 활용할 수 없다.

MongoDB

// Constraint-like checks with schema validation rules
db.runCommand({ collMod: "product",
  validator: { $jsonSchema: { required: ["price"], properties: { price: { bsonType: "number", minimum: 0 } } } },
  validationLevel: "strict"
});
// Unique index for uniqueness
db.customer.createIndex({ email: 1 }, { unique: true });

외래 키가 없다(애플리케이션 계층에서 보장). UNIQUE에 해당하는 것은 unique 인덱스다. CHECK 대신 $jsonSchema 검증을 사용하며, validationAction: 'warn'으로 비활성화와 같은 효과를 낸다.

Redis

# Not applicable: Redis has no FK/CHECK/UNIQUE constraints. Uniqueness is enforced at the application level with SET or
# SETNX/conditional writes.
SET customer:email:[email protected] 1 NX

관계 무결성이나 제약 조건 개념이 없다. 유일성은 애플리케이션 측에서 SET ... NX(없을 때만 쓰기)나 별도 SET/HASH 확인으로 관리한다.

Elasticsearch

# Not applicable: Elasticsearch has no FK/CHECK. Field types are enforced with the mapping,
# and uniqueness with a fixed _id.
PUT product/_doc/ABC-123
{ "price": 100 }

엔진에 관계와 제약 조건이 존재하지 않는다. 타입 검사는 mapping으로 이루어진다. UNIQUE 효과를 내려면 자연 키를 _id로 사용하거나(같은 _id로 쓰면 덮어씀) op_type=create로 충돌을 거부한다.

DBAtlas에서 열기 →