🙏 感谢您的支持! 我们在七月份已经筹集了 $65 — 这足够我们工作到下个月。请帮助我们保持进度,进一步支持这个项目。 支持这个项目 →
SQL 代码已复制到剪贴板

课程 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_namelast_name 是最长为 50 个字符的文本值;
  • birth_date 存储出生日期;
  • created_at 存储记录创建的日期和时间。

运行此命令后,表将被创建,但仍然是空的。


常用数据类型

创建表时,选择合适的数据类型非常重要。以下是一些最常见的数据类型:

  • INT 用于整数;
  • VARCHAR(n) 用于长度可变的字符串,最多为 n 个字符;
  • TEXT 用于长文本值;
  • DATE 用于日历日期;
  • TIMESTAMP 用于日期和时间值,通常用于存储行创建或更新的时间;
  • DECIMAL(p, s) 用于精确的数值,例如货币;
  • BOOLEAN 用于逻辑值 TRUEFALSE

选择正确的数据类型有助于节省空间、维护数据质量并避免错误。您可以在这里阅读更多关于数据类型的信息。


列约束

约束定义了存储在表中的数据的规则。

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_namelast_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 SETCOLLATE

对于文本列,您可以明确指定字符集和排序规则。

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_namelast_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 SETCOLLATE
  • 尽量使结构从一开始就清晰可预测。

设计良好的表可以减少错误,并使后续的 INSERTUPDATESELECT 操作更容易。


实际示例

想象一下,我们想要创建一个用于存储书籍的表:

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 KEYNOT NULLUNIQUECHECK 有助于控制数据质量。
  • 额外的列参数如 DEFAULTCHARACTER SETCOLLATE 有助于微调数据存储和行为。
  • 设计良好的表使未来的数据工作更简单、更可靠。
  • IF NOT EXISTS 有助于避免多次创建表时的错误。

尝试解决以下任务,以巩固您在本课中学到的内容。

  1. 创建部门表
  2. 创建企鹅统计表
  3. 创建企鹅表