基于BuiltWith API的网站技术栈探测:Python自动化实现与实战应用
2026/5/8 15:11:32
约束是数据库为了保证数据的完整性、准确性、有效性,对表数据添加的强制性规则。
id字段作为主键-- 创建表时指定主键 CREATE TABLE student ( id INT PRIMARY KEY, name VARCHAR(255), age INT, email VARCHAR(255) ); -- 错误示例:插入重复主键(会报错) INSERT INTO student(id, name, age, email) VALUES (1, '张三', 18, '1443005893@qq.com'); INSERT INTO student(id, name, age, email) VALUES (1, '李四', 20, '1443005893@qq.com'); -- 报错:Duplicate entry '1' for key 'PRIMARY'为了避免手动维护主键重复,MySQL 提供了自增特性,让数据库自动维护主键值:
-- 创建自增主键表 CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), age INT, email VARCHAR(255) ); -- 插入数据时无需指定 id,数据库自动生成 INSERT INTO student(name, age, email) VALUES ('张三', 18, '1443005893@qq.com'); INSERT INTO student(name, age, email) VALUES ('李四', 20, '1443005893@qq.com');VARCHAR(255)长度的字段,MySQL 无法设置唯一约束(索引长度限制)CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), age INT, email VARCHAR(255) UNIQUE -- 邮箱不允许重复 ); -- 第一次插入正常 INSERT INTO student(name, age, email) VALUES ('张三', 18, '1443005893@qq.com'); -- 第二次插入重复邮箱,报错 INSERT INTO student(name, age, email) VALUES ('lisi', 20, '1443005893@qq.com'); -- 报错:Duplicate entry '1443005893@qq.com' for key 'email'CREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, -- 姓名不允许为空 age INT, email VARCHAR(255) ); -- 错误示例:插入空姓名(会报错) INSERT INTO student(name, age, email) VALUES (NULL, 18, '1443005893@qq.com'); -- 报错:Column 'name' cannot be nullCREATE TABLE student ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, age INT DEFAULT 18, -- 年龄默认 18 gender CHAR(1) DEFAULT '男' -- 性别默认男 ); -- 插入数据时不指定 age 和 gender,自动使用默认值 INSERT INTO student(name) VALUES ('张三'); -- 查询结果:age=18, gender='男'-- 主表:部门表(父表) CREATE TABLE dept ( dept_id INT PRIMARY KEY AUTO_INCREMENT, dept_name VARCHAR(50) ); -- 从表:员工表(子表),通过外键关联部门表 CREATE TABLE emp ( emp_id INT PRIMARY KEY AUTO_INCREMENT, emp_name VARCHAR(50), dept_id INT, FOREIGN KEY (dept_id) REFERENCES dept(dept_id) );| 配置项 | 说明 |
|---|---|
| 外键名(name) | 可省略,系统自动生成 |
| 字段(field) | 子表中用于关联的字段 |
| 参考数据库 | 外键关联的数据库 |
| 引用表(reference table) | 关联的主表 |
| 外栏位名(outside field) | 主表中被关联的字段 |
| 规则 | 作用 |
|---|---|
| CASCADE | 父表更新 / 删除记录时,子表对应记录同步更新 / 删除 |
| SET NULL | 父表更新 / 删除记录时,子表对应字段设为 NULL(子表字段需允许为空) |
| NO ACTION / RESTRICT | 子表有匹配记录时,禁止父表更新 / 删除操作 |
InnoDBCREATE TABLE student ( -- 主键约束 + 自增 id INT PRIMARY KEY AUTO_INCREMENT, -- 非空约束 name VARCHAR(255) NOT NULL, -- 默认约束 age INT DEFAULT 18, -- 唯一约束 email VARCHAR(255) UNIQUE, -- 外键约束(关联班级表) class_id INT, FOREIGN KEY (class_id) REFERENCES class(class_id) );INT类型,避免使用业务字段作为主键(如学号、手机号)NOT NULL,避免逻辑错误| 报错场景 | 错误原因 | 解决方法 |
|---|---|---|
| Duplicate entry | 主键 / 唯一约束重复 | 检查插入数据是否重复,或使用自增主键 |
| Column cannot be null | 非空约束字段插入空值 | 为非空字段提供有效数据 |
| Foreign key constraint fails | 外键关联数据不存在 | 先插入主表数据,再插入子表 |