DBAtlas · Atlas de operações de banco de dados

Adicionar ou desabilitar uma constraint (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;

As constraints do Oracle podem ser desligadas temporariamente com DISABLE/ENABLE (útil em cargas em massa). ENABLE VALIDATE verifica as linhas existentes; NOVALIDATE não.

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;

O PostgreSQL não tem DISABLE de constraint. Para reduzir o lock em uma tabela grande, adicione a constraint com NOT VALID e faça VALIDATE depois. ALTER TABLE ... DISABLE TRIGGER ALL também desabilita os triggers internos da FK e exige superuser; os dados inseridos enquanto estão desligados nunca são validados, e reabilitar não verifica retroativamente (risco de perda silenciosa de integridade). Em vez disso, faça DROP da constraint, adicione-a novamente com NOT VALID e depois execute 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;

Requer InnoDB. Em vez de desabilitar uma única constraint, usa-se SET FOREIGN_KEY_CHECKS=0 em nível de sessão. As constraints CHECK só são de fato aplicadas a partir do MySQL 8.0.16 (antes eram ignoradas).

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;

No SQL Server, as constraints FK/CHECK são desabilitadas com NOCHECK CONSTRAINT. Se WITH CHECK CHECK CONSTRAINT não for usado ao reabilitar, a constraint fica 'not trusted' e o otimizador de consultas não pode usá-la.

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 });

Não há chaves estrangeiras (são garantidas na camada da aplicação). O equivalente a UNIQUE é um índice único. Em vez de CHECK, use validação $jsonSchema; validationAction: 'warn' produz o efeito de desabilitá-la.

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

Não existe o conceito de integridade relacional ou constraints. A unicidade é controlada no lado da aplicação com SET ... NX (grava apenas se não existir) ou verificando um SET/HASH separado.

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 }

Relações e constraints não existem no engine. A verificação de tipos é feita pelo mapping. Para um efeito de UNIQUE, use a chave natural como _id (escritas no mesmo _id sobrescrevem) ou rejeite conflitos com op_type=create.

Abrir no DBAtlas →