在 MySQL 中,唯一键(UNIQUE KEY)确实可以包含 NULL 值,但有一些特殊的行为需要注意:
允许多个 NULL 值:MySQL 中唯一约束允许列包含多个 NULL 值,因为 NULL 被视为"未知值",不与其他 NULL 值相等。
非 NULL 值必须唯一:对于非 NULL 值,唯一约束仍然有效,即不能有重复的非 NULL 值。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE,
email VARCHAR(100)
);
-- 这些插入操作是允许的
INSERT INTO users (username, email) VALUES (NULL, 'user1@example.com');
INSERT INTO users (username, email) VALUES (NULL, 'user2@example.com');
-- 这些操作会违反唯一约束
INSERT INTO users (username, email) VALUES ('john', 'john@example.com');
INSERT INTO users (username, email) VALUES ('john', 'john2@example.com'); -- 会报错
需要注意的是,这种行为是 MySQL 特有的。其他数据库系统如 SQL Server、Oracle 等对唯一约束中的 NULL 值处理方式可能不同:
如果需要在 MySQL 中强制 NULL 值也遵守唯一性约束,可以使用以下方法:
-- 方法3示例
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL DEFAULT '',
email VARCHAR(100),
UNIQUE KEY (username)
);
MySQL 的唯一键确实允许 NULL 值,并且允许多个 NULL 值存在。这是 MySQL 特有的行为,在设计和迁移数据库时需要特别注意。