DBAtlas · Atlas de operaciones de bases de datos

Añadir o deshabilitar una restricción (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;

Las restricciones de Oracle se pueden desactivar temporalmente con DISABLE/ENABLE (útil para cargas masivas). ENABLE VALIDATE comprueba las filas existentes; NOVALIDATE no.

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 no tiene DISABLE de restricciones. Para reducir el bloqueo en una tabla grande, añada la restricción con NOT VALID y haga VALIDATE más tarde. ALTER TABLE ... DISABLE TRIGGER ALL también deshabilita los triggers internos de la FK y requiere superuser; los datos insertados mientras están desactivados nunca se validan, y volver a habilitarlos no comprueba de forma retroactiva (riesgo de pérdida silenciosa de integridad). En su lugar, haga DROP de la restricción, vuelva a añadirla con NOT VALID y luego ejecute 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;

Requiere InnoDB. En lugar de deshabilitar una restricción concreta, se usa SET FOREIGN_KEY_CHECKS=0 a nivel de sesión. Las restricciones CHECK se aplican realmente a partir de MySQL 8.0.16 (antes se ignoraban).

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;

En SQL Server, las restricciones FK/CHECK se deshabilitan con NOCHECK CONSTRAINT. Si no se usa WITH CHECK CHECK CONSTRAINT al volver a habilitarlas, la restricción queda como 'not trusted' y el optimizador de consultas no puede usarla.

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

No hay claves foráneas (se aplican en la capa de aplicación). El equivalente de UNIQUE es un índice único. En lugar de CHECK, use la validación $jsonSchema; validationAction: 'warn' logra el efecto de deshabilitarla.

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

No existe el concepto de integridad relacional ni de restricciones. La unicidad se gestiona en la aplicación con SET ... NX (escribir solo si no existe) o comprobando un SET/HASH aparte.

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 }

El motor no tiene relaciones ni restricciones. La comprobación de tipos se hace con el mapping. Para un efecto UNIQUE, use la clave natural como _id (las escrituras sobre el mismo _id sobrescriben) o rechace los conflictos con op_type=create.

Abrir en DBAtlas →