SQL 表操作和约束
本章介绍如何创建、修改、删除数据表,以及如何使用约束。
CREATE TABLE 创建表
基本语法
CREATE TABLE 表名 (
列名1 数据类型 [约束],
列名2 数据类型 [约束],
...
);
完整示例
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
email VARCHAR(50) UNIQUE,
age INT DEFAULT 18,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
约束类型
1. PRIMARY KEY(主键)
- 唯一标识每条记录
- 不能为空
- 一个表只能有一个主键
-- 方式1:列级约束
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 方式2:表级约束
CREATE TABLE users (
id INT,
name VARCHAR(50),
PRIMARY KEY (id)
);
-- 复合主键
CREATE TABLE orders (
user_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (user_id, product_id)
);
2. AUTO_INCREMENT(自增)
- 自动生成唯一ID
- 通常与主键配合使用
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
-- 插入时省略 id,会自动生成
INSERT INTO users (name) VALUES ('张三');
3. NOT NULL(非空)
- 列不能为空
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(50)
);
4. UNIQUE(唯一)
- 列值不能重复
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(50) UNIQUE
);
5. DEFAULT(默认值)
- 列的默认值
CREATE TABLE users (
id INT PRIMARY KEY,
status VARCHAR(20) DEFAULT 'active',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
6. CHECK(检查)
- 限制列的取值范围
CREATE TABLE users (
id INT PRIMARY KEY,
age INT CHECK (age >= 0 AND age <= 150)
);
7. FOREIGN KEY(外键)
- 关联另一个表
CREATE TABLE orders (
id INT PRIMARY KEY,
user_id INT,
product_id INT,
quantity INT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
ALTER TABLE 修改表
添加列
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
删除列
ALTER TABLE users DROP COLUMN phone;
修改列
-- 修改列类型
ALTER TABLE users MODIFY COLUMN name VARCHAR(100);
-- 修改列名和类型
ALTER TABLE users CHANGE COLUMN name username VARCHAR(50);
添加约束
-- 添加主键
ALTER TABLE users ADD PRIMARY KEY (id);
-- 添加外键
ALTER TABLE orders
ADD FOREIGN KEY (user_id) REFERENCES users(id);
-- 添加检查约束
ALTER TABLE users ADD CONSTRAINT age_check
CHECK (age >= 0 AND age <= 150);
删除约束
-- 删除主键
ALTER TABLE users DROP PRIMARY KEY;
-- 删除外键
ALTER TABLE orders DROP FOREIGN KEY orders_ibfk_1;
-- 删除唯一约束
ALTER TABLE users DROP INDEX email;
DROP TABLE 删除表
-- 删除表(不可恢复)
DROP TABLE users;
-- 删除前先备份
CREATE TABLE users_backup AS SELECT * FROM users;
DROP TABLE users;
TRUNCATE 清空表
-- 清空表数据,重置自增
TRUNCATE TABLE users;
CREATE INDEX 索引
创建索引
-- 单列索引
CREATE INDEX idx_name ON users(name);
-- 唯一索引
CREATE UNIQUE INDEX idx_email ON users(email);
-- 复合索引
CREATE INDEX idx_name_age ON users(name, age);
删除索引
DROP INDEX idx_name ON users;
约束综合示例
CREATE TABLE employees (
-- 主键自增
id INT PRIMARY KEY AUTO_INCREMENT,
-- 非空唯一
employee_id VARCHAR(10) NOT NULL UNIQUE,
-- 非空
name VARCHAR(50) NOT NULL,
-- 默认值
department VARCHAR(50) DEFAULT 'General',
-- 检查约束
salary DECIMAL(10, 2) CHECK (salary >= 0),
-- 外键关联部门表
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(id),
-- 创建时间
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
常见错误
1. 主键重复
INSERT INTO users (id, name) VALUES (1, '张三');
INSERT INTO users (id, name) VALUES (1, '李四');
-- Error: Duplicate entry '1' for key 'PRIMARY'
2. 外键引用不存在
-- users 表不存在 id=100 的记录
INSERT INTO orders (user_id, product_id) VALUES (100, 1);
-- Error: Cannot add or update a child row
3. 违反 CHECK 约束
INSERT INTO users (name, age) VALUES ('张三', -1);
-- Error: Check constraint violation
小结
本章我们学习了:
- CREATE TABLE 创建表
- 各种约束(PRIMARY KEY, NOT NULL, UNIQUE, DEFAULT, CHECK, FOREIGN KEY)
- ALTER TABLE 修改表结构
- DROP TABLE / TRUNCATE 删除表
- 索引的创建和使用
练习
- 创建一个学生表,包含学号、姓名、年龄、班级(使用约束)
- 添加一个索引用于查询学生
- 修改表结构,添加邮箱字段
- 删除表并重建