🐸 青蛙编程网
首页 / 数据库 / SQLite / 3. 建库建表与数据类型

3. 建库建表与数据类型

这是什么:SQLite 的建表语法和 MySQL 几乎一样,但类型系统不同——它只有 5 种存储类型(NULL / INTEGER / REAL / TEXT / BLOB),并靠「类型亲和」(type affinity)决定你的数据实际怎么存。

为什么用:从 MySQL 过来的人最容易在这里犯迷糊——明明建了 VARCHAR(50),怎么存进去变 TEXT 了?搞懂亲和,差异就通了。

如何用:还是建 user 和 article 两张表,重点看 SQLite 写法与 MySQL 写法的对照。

3.1 五种存储类型

类型 存什么 类比
NULL 空值 没填
INTEGER 整数 数量、id
REAL 浮点数 均分、金额(粗略)
TEXT 文本 用户名、标题
BLOB 二进制 图片、文件

没有 DATE 类型——时间用 TEXT("2026-10-25")或 INTEGER(时间戳)存,这是新手第二个惊讶点。

3.2 类型亲和:列的类型只是「建议」

建表时写的类型,SQLite 会把它归并到 5 种亲和之一(如 VARCHAR → TEXT 亲和、INT → INTEGER 亲和),插入的数据再按亲和转换:

CREATE TABLE demo (a TEXT, b);
INSERT INTO demo VALUES (123, 'x');
SELECT a, typeof(a) FROM demo;

预期输出(数字 123 存进 TEXT 列,被转成了文本):

123|text

MySQL 对超长或类型不符会报错或截断,SQLite 则尽量「帮你转」——约束更松,更要自己把关。

3.3 建两张博客表

CREATE TABLE user (
    id       INTEGER PRIMARY KEY,
    username TEXT NOT NULL UNIQUE,
    email    TEXT
);

CREATE TABLE article (
    id      INTEGER PRIMARY KEY,
    title   TEXT NOT NULL,
    views   INTEGER DEFAULT 0,
    user_id INTEGER NOT NULL REFERENCES user(id)
);

建好后用 .schema user 看一眼实际结构:

sqlite> .schema user
CREATE TABLE user (
    id       INTEGER PRIMARY KEY,
    username TEXT NOT NULL UNIQUE,
    email    TEXT
);

3.4 与 MySQL 的写法对照

你想表达 MySQL 写法 SQLite 写法
自增主键 INT AUTO_INCREMENT PRIMARY KEY INTEGER PRIMARY KEY(自动自增)
短文本 VARCHAR(50) TEXT(长度可写,但被忽略)
时间 DATETIME TEXT 存 "2026-10-25 12:00:00"
布尔 BOOLEAN INTEGER 存 0 / 1

最值得注意的是第一条:INTEGER PRIMARY KEY 就是自增主键,这是 SQLite 的固定搭配(本质是行号的别名 ROWID),不用再写 AUTO_INCREMENT。

3.5 动手改

  1. 建一张 comment 表:id、text(NOT NULL)、user_id、article_id,全部外键指向对应表
  2. 往 user.email 插入数字 123,再用 typeof() 查它变成了什么
  3. 建一张 age INTEGER 列的表,插入 'abc' 会成功吗?(会——转换失败就按原样存,想想这算不算隐患)

3.6 小结

  • SQLite 只有 NULL / INTEGER / REAL / TEXT / BLOB 五种存储类型
  • 列类型是「亲和建议」,数据按亲和尽量转换
  • INTEGER PRIMARY KEY = 自增主键;时间用 TEXT 或时间戳存

下一章:增删改:INSERT / UPDATE / DELETE 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。