课程 9.1: CREATE TABLE 语句
到目前为止,我们主要处理了现有的表并从中检索数据。但在实际的数据库工作中,不仅要读取数据,还要知道如何创建用于存储数据的结构。这就是 CREATE TABLE 语句的用武之地。
CREATE TABLE 属于 数据定义语言 (DDL)。它用于描述表的结构:包含哪些列,这些列将使用哪些数据类型,以及将适用于存储在其中的值的哪些规则。
基本语法
该语句的最简单形式如下所示:
CREATE TABLE table_name (
column1 data_type,
column2 data_type,
column3 data_type
);
在表名之后,列在括号内列出。对于每一列,您需要指定:
- 列名(必需);
- 数据类型(必需);
- 以及在需要时,其他特性,如编码、约束、注释等。
简单表的示例
让我们创建一个 students 表:
CREATE TABLE students (
student_id INT,
first_name VARCHAR(50),
last_name VARCHAR(50),
birth_date DATE,
created_at TIMESTAMP
);
在这个例子中:
student_id是一个整数;first_name和last_name是最长为 50 个字符的文本值;birth_date存储出生日期;created_at存储记录创建的日期和时间。
运行此命令后,表将被创建,但仍然是空的。
常用数据类型
创建表时,选择合适的数据类型非常重要。以下是一些最常见的数据类型:
INT用于整数;VARCHAR(n)用于长度可变的字符串,最多为n个字符;TEXT用于长文本值;DATE用于日历日期;TIMESTAMP用于日期和时间值,通常用于存储行创建或更新的时间;DECIMAL(p, s)用于精确的数值,例如货币;BOOLEAN用于逻辑值TRUE或FALSE。
选择正确的数据类型有助于节省空间、维护数据质量并避免错误。您可以在这里阅读更多关于数据类型的信息。
列约束
约束定义了存储在表中的数据的规则。
1. PRIMARY KEY
主键唯一标识表中的每一行。
CREATE TABLE students (
student_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50)
);
student_id 列不能包含重复值或 NULL。
2. NOT NULL
此约束要求列必须始终包含一个值。
CREATE TABLE students (
student_id INT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL
);
现在 first_name 和 last_name 不能留空。
3. CHECK
CHECK 约束定义了列中值必须满足的条件。
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
price DECIMAL(10, 2) CHECK (price >= 0)
);
在这个例子中,数据库将不允许存储价格为负的产品。
额外的列参数
除了约束外,列还可以有额外的参数。这些参数并不直接禁止或允许值,但它们有助于更精确地定义列的行为。
1. DEFAULT
DEFAULT 参数定义在插入时如果未提供值将使用的值。
CREATE TABLE products (
product_id INT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
price DECIMAL(10, 2) DEFAULT 0.00
);
如果在添加产品时未提供价格,数据库将自动使用 0.00。
2. CHARACTER SET 和 COLLATE
对于文本列,您可以明确指定字符集和排序规则。
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
first_name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,
last_name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);
在这里,CHARACTER SET 定义用于存储文本数据的编码,而 COLLATE 定义字符串的比较和排序方式。这在表需要正确处理不同语言和字符时尤其重要。
具有多个规则的表的示例
这是一个更现实的 employees 表的示例:
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
hire_date DATE NOT NULL,
salary DECIMAL(10, 2) DEFAULT 0.00
);
这里发生的事情是:
employee_id是员工的唯一标识符;first_name和last_name是必需的;email必须是唯一的;hire_date是必需的;salary默认为0.00。
这个结构更好地反映了现实世界的数据需求。
使用 IF NOT EXISTS
在许多数据库系统中,您可以通过使用 IF NOT EXISTS 来避免表已存在时的错误:
CREATE TABLE IF NOT EXISTS departments (
department_id INT PRIMARY KEY,
department_name VARCHAR(100) NOT NULL
);
这在重新运行练习脚本或迁移时非常有用。
注意事项
创建表时,记住一些规则是有帮助的:
- 深思熟虑地选择数据类型,而不是让所有内容过于通用;
- 为每一行必须唯一标识的表定义
PRIMARY KEY; - 对于真正必需的字段使用
NOT NULL; - 当列有自然默认值时使用
DEFAULT; - 在需要时明确设置文本字段的
CHARACTER SET和COLLATE; - 尽量使结构从一开始就清晰可预测。
设计良好的表可以减少错误,并使后续的 INSERT、UPDATE 和 SELECT 操作更容易。
实际示例
想象一下,我们想要创建一个用于存储书籍的表:
CREATE TABLE books (
book_id INT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
author VARCHAR(100) NOT NULL,
published_date DATE,
price DECIMAL(8, 2) DEFAULT 0.00
);
一旦创建了这个表,我们就可以开始使用 INSERT INTO 向其中添加行。
本课的关键要点:
CREATE TABLE语句用于在数据库中创建新表。- 每一列必须有一个名称和一个数据类型。
- 约束如
PRIMARY KEY、NOT NULL、UNIQUE和CHECK有助于控制数据质量。 - 额外的列参数如
DEFAULT、CHARACTER SET和COLLATE有助于微调数据存储和行为。 - 设计良好的表使未来的数据工作更简单、更可靠。
IF NOT EXISTS有助于避免多次创建表时的错误。