2023-06-23 10:59:59
MySQL中的UNIQUE约束通过B-Tree索引实现唯一性,具体机制如下:
索引结构
当为列或列组添加UNIQUE约束时,MySQL会自动创建B-Tree索引。B-Tree索引通过树形结构存储数据,支持高效的等值查询和范围查询,确保快速验证唯一性。
插入与更新时的校验
插入数据:执行INSERT时,MySQL通过B-Tree索引检查待插入值是否已存在。若存在重复值(非NULL),则抛出唯一性冲突错误(如Duplicate entry),阻止插入。
更新数据:执行UPDATE时,若修改的值涉及UNIQUE约束列,MySQL会同样检查新值猛搜枣是否与现有数据冲突。若冲突,操作被拒绝。
NULL值处理漏或
UNIQUE约束允许NULL值,但将NULL视为独立值。即多行中同一列的NULL值不会触发唯一性冲突(除非显式定义为NOT NULL)。
多列组合约束
若UNIQUE约束定义在多列上(如UNIQUE (col1, col2)),则这些列的组合值必须唯一。例如,(A, B)和(A, C)允许共存,但(A, B)重复则报错。
与PRIMARY KEY的区别
NULL值:PRIMARY KEY不允枝拆许NULL,而UNIQUE允许。
多列定义:两者均可跨多列,但PRIMARY KEY隐含UNIQUE约束。
表限制:一个表只能有一个PRIMARY KEY,但可有多个UNIQUE约束。
性能优化
B-Tree索引的查找复杂度为O(log n),确保高效校验。UNIQUE约束的维护成本略高于普通索引(因需检查冲突),但比PRIMARY KEY更灵活。
示例:
-- 创建表时定义单列UNIQUE约束CREATE TABLE users ( id INT, email VARCHAR(100) UNIQUE, -- 列级约束 PRIMARY KEY (id));-- 定义多列组合UNIQUE约束CREATE TABLE orders ( order_id INT, product_id INT, UNIQUE (order_id, product_id) -- 表级约束);-- 插入重复值测试(会报错)INSERT INTO users (id, email) VALUES (1, 'test@example.com');INSERT INTO users (id, email) VALUES (2, 'test@example.com'); -- 触发唯一性错误总结:UNIQUE约束通过B-Tree索引在插入和更新时动态校验数据唯一性,支持NULL值和多列组合,是保障数据完整性的关键机制。