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 — уникальный индекс. Вместо 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:sample@x.com 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 →