DBAtlas · Atlas für Datenbankbetrieb

Constraint hinzufügen oder deaktivieren (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-Constraints lassen sich mit DISABLE/ENABLE vorübergehend abschalten (nützlich bei Bulk Loads). ENABLE VALIDATE prüft vorhandene Zeilen, NOVALIDATE nicht.

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 kennt kein DISABLE für Constraints. Um Sperren auf einer großen Tabelle zu reduzieren, den Constraint mit NOT VALID hinzufügen und später mit VALIDATE prüfen. ALTER TABLE ... DISABLE TRIGGER ALL deaktiviert auch die internen Trigger des FK und erfordert Superuser; währenddessen eingefügte Daten werden nie validiert, und das erneute Aktivieren prüft nicht rückwirkend (Risiko stillen Integritätsverlusts). Stattdessen den Constraint mit DROP entfernen, mit NOT VALID neu hinzufügen und dann VALIDATE CONSTRAINT ausführen.

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;

Erfordert InnoDB. Statt einen einzelnen Constraint zu deaktivieren, wird das sessionweite SET FOREIGN_KEY_CHECKS=0 verwendet. CHECK-Constraints werden erst ab MySQL 8.0.16 tatsächlich durchgesetzt (vorher ignoriert).

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;

In SQL Server werden FK/CHECK-Constraints mit NOCHECK CONSTRAINT deaktiviert. Wird beim erneuten Aktivieren nicht WITH CHECK CHECK CONSTRAINT verwendet, bleibt der Constraint „not trusted“ und der Query Optimizer kann ihn nicht nutzen.

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

Es gibt keine Foreign Keys (Durchsetzung in der Anwendungsschicht). Das UNIQUE-Äquivalent ist ein Unique Index. Statt CHECK $jsonSchema-Validierung verwenden; validationAction: 'warn' wirkt wie ein Deaktivieren.

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

Ein Konzept für relationale Integrität oder Constraints gibt es nicht. Eindeutigkeit wird auf Anwendungsseite mit SET ... NX (nur schreiben, wenn nicht vorhanden) oder durch Prüfen eines separaten SET/HASH sichergestellt.

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 }

Relationen und Constraints gibt es in der Engine nicht. Die Typprüfung erfolgt über das Mapping. Für einen UNIQUE-Effekt den natürlichen Schlüssel als _id verwenden (Schreibvorgänge auf dieselbe _id überschreiben) oder Konflikte mit op_type=create abweisen.

In DBAtlas öffnen →