Kodokon kodokon.com

创建模式:CREATE TABLE 与约束

用合适的类型以及保护数据的 NOT NULL、UNIQUE 和 PRIMARY KEY 约束,设计你自己的表。

8 分钟 · 3 题

在 Kodokon 中打开本课

到目前为止,你查询的都是现成的表;而专业开发者是自己设计它们的。一个好的模式会在插入时就拒绝无效数据:它是你的第一道防线,先于任何应用代码。请在 sqliteonline.com 或 sqlite3 中创建这张表:

SQL
CREATE TABLE users (
  id INTEGER PRIMARY KEY,
  email TEXT NOT NULL UNIQUE,
  username TEXT NOT NULL UNIQUE,
  created_at TEXT NOT NULL
    DEFAULT (datetime('now'))
);
三个约束:NOT NULL、UNIQUE 和一个默认值。

SQLite 只认识五种存储类型:INTEGERREALTEXTBLOBNULL。日期在其中以 ISO 格式的 TEXT 存储(2026-07-04)。在别处(PostgreSQL、MySQL),你则会声明 VARCHAR(255)TIMESTAMPBOOLEAN:原理不变,只是类型名称有所不同。现在来测试你的约束:

SQL
INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice');

INSERT INTO users (email, username)
VALUES ('alice@example.com', 'alice2');
第二次插入会失败:UNIQUE constraint failed。

主键用于标识每一行:绝不为 NULL,绝不重复,每张表只有一个。在 SQLite 中,INTEGER PRIMARY KEY 有一个宝贵的特性:当你省略它的值时,该列会自动递增,就像上面那些插入语句那样。在 PostgreSQL 上你会写 GENERATED ALWAYS AS IDENTITY,在 MySQL 上写 AUTO_INCREMENT。最后,用 CHECK 添加一条业务规则:

SQL
CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  sku TEXT NOT NULL UNIQUE,
  price REAL NOT NULL CHECK (price >= 0)
);

INSERT INTO products (name, sku, price)
VALUES ('Keyboard', 'KB-01', -5);
被拒绝:CHECK constraint failed。没有任何负价格能通过。

知识检测

确认你已牢记本课的重点内容。

  1. 哪个约束能保证 email 列中不出现重复值?
    • NOT NULL
    • UNIQUE
    • CHECK
    • DEFAULT
  2. PRIMARY KEY 和 UNIQUE 有什么区别?
    • 没有区别,它们是同义词
    • 主键用于标识行:每张表只有一个,绝不为 NULL
    • UNIQUE 比 PRIMARY KEY 更严格
  3. 在 SQLite 中,如果你插入一行却没有为 INTEGER PRIMARY KEY 列提供值,会发生什么?
    • 会抛出一个 NOT NULL 错误
    • SQLite 会自动生成一个唯一的整数
    • 该列会保持为 NULL