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 的等价物是唯一索引。用 $jsonSchema 验证代替 CHECK;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 中打开 →