数据库约束是确保数据完整性和规范性的关键机制。正确写法包括PRIMARY KEY、FOREIGN KEY、UNIQUE、NOT NULL、CHECK和DEFAULT约束。示例:CREATE TABLE users (id INT PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, age INT CHECK (age >= 0), status ENUM('active','inactive') DEFAULT 'active');
主键约束
主键约束用于唯一标识表中的每一行数据,确保没有重复或NULL值。语法:column_name data_type PRIMARY KEY。好处:加速查询,提高数据一致性。例如,在用户表中,id字段设为主键:ALTER TABLE users ADD PRIMARY KEY (id);
外键约束
外键约束建立表与表之间的引用完整性。语法:FOREIGN KEY (column) REFERENCES parent_table(parent_column)。例如,orders表中的user_id引用users表的id:FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; 这确保订单只能属于存在的用户。
唯一约束
唯一约束确保列中所有值唯一,但允许NULL。语法:column_name data_type UNIQUE。例如,email字段:email VARCHAR(100) UNIQUE; 防止用户重复注册相同邮箱。
非空约束
NOT NULL约束禁止列中插入NULL值。语法:column_name data_type NOT NULL。例如,username VARCHAR(50) NOT NULL; 确保用户名必须填写。
检查约束
CHECK约束自定义业务规则。语法:column_name data_type CHECK (condition)。例如,salary DECIMAL(10,2) CHECK (salary > 0); 防止负薪资。
默认值约束
DEFAULT提供列的默认值。语法:column_name data_type DEFAULT value。例如,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP; 自动记录创建时间。
约束最佳实践
1. 优先使用主键。2. 外键添加索引。3. CHECK约束简单明了。4. 适度使用,避免过度约束影响性能。5. 测试约束在开发阶段。
FAQ
Q: 主键和唯一约束区别?
A: 主键不允许NULL且只有一个,唯一允许NULL且可多个。
Q: 外键删除级联怎么用?
A: ON DELETE CASCADE自动删除子表记录。
Q: 如何删除约束?
A: ALTER TABLE table_name DROP CONSTRAINT constraint_name;
Q: MySQL和PostgreSQL约束差异?
A: PostgreSQL CHECK更强大,MySQL部分存储引擎不支持。