DBAtlas · Atlas d'exploitation des bases de données

Ajouter ou désactiver une contrainte (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;

Les contraintes Oracle peuvent être désactivées temporairement avec DISABLE/ENABLE (utile pour les chargements massifs). ENABLE VALIDATE vérifie les lignes existantes ; NOVALIDATE ne le fait pas.

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 ne permet pas de DISABLE sur une contrainte. Pour limiter le verrouillage sur une grande table, ajoutez la contrainte avec NOT VALID puis faites un VALIDATE plus tard. ALTER TABLE ... DISABLE TRIGGER ALL désactive aussi les triggers internes de la FK et nécessite superuser ; les données insérées pendant la désactivation ne sont jamais validées, et la réactivation ne vérifie pas rétroactivement (risque de perte d'intégrité silencieuse). À la place, faites un DROP de la contrainte, rajoutez-la avec NOT VALID, puis exécutez 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;

Nécessite InnoDB. Au lieu de désactiver une contrainte précise, on utilise SET FOREIGN_KEY_CHECKS=0 au niveau session. Les contraintes CHECK ne sont réellement appliquées qu'à partir de MySQL 8.0.16 (elles étaient ignorées auparavant).

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;

Dans SQL Server, les contraintes FK/CHECK sont désactivées avec NOCHECK CONSTRAINT. Si WITH CHECK CHECK CONSTRAINT n'est pas utilisé lors de la réactivation, la contrainte reste « not trusted » et l'optimiseur de requêtes ne peut pas l'exploiter.

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

Il n'y a pas de clés étrangères (appliquées dans la couche applicative). L'équivalent de UNIQUE est un index unique. Au lieu de CHECK, utilisez la validation $jsonSchema ; validationAction: 'warn' revient à la désactiver.

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

Il n'existe pas de notion d'intégrité relationnelle ni de contraintes. L'unicité se gère côté application avec SET ... NX (écriture uniquement si absent) ou en vérifiant un SET/HASH distinct.

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 }

Les relations et contraintes n'existent pas dans le moteur. Le contrôle de type se fait via le mapping. Pour un effet UNIQUE, utilisez la clé naturelle comme _id (les écritures sur le même _id écrasent) ou rejetez les conflits avec op_type=create.

Ouvrir dans DBAtlas →