首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >什么int类型里面能插入文字,还不能改字段类型--SQLite 五脏俱全系列 (2)

什么int类型里面能插入文字,还不能改字段类型--SQLite 五脏俱全系列 (2)

作者头像
AustinDatabases
发布2026-04-16 14:41:20
发布2026-04-16 14:41:20
900
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

去年SQLlite的几个文章爆火,我都没有想到几万的阅读量。今年我们也新开一个系列叫SQLite知多少,我们继续深入到SQLite的使用问题的探究中.

SQLite需要初始化参数,怎么调优-- SQLite 五脏俱全系列 (1)

SQLite 开发中的数据库开发规范 --如何提升业务系统性能避免基础BUG

基于SQLite如何设计应用程序,拆散,散,还的散!

SQLite3 打败了 PostgreSQL 终究还是没能挽回--世界最大装机量是真的

果不其然,SQLite的研究引来一堆人的关注,上一篇爆了

我们此次选择的版本是3.45.3,这个版本在适应的系统的广泛性都要比新的版本要好,并且一些我们需要的核心技术的更新也都做了,BUG的FIX也做了。所以这个版本将作为我们的研究和使用的核心版本。

上期我们回顾了SQLite的一些关键信息,本期我们开始从语法开始,这些语法是针对开发人员,这里有一个小问题,就是对应版本的安装问题,这里我们使用的是编译的方式,通过下载源代码的方式来进行安装

https://sqlite.org/src/info/6b21cccdeec92db9,下载源代码后,直接进行./configure make make install 的方式即可

今天我们先建立一张自增的表并围绕这个表来进行日常语句语法的学习

代码语言:javascript
复制
sqlite> CREATE TABLE test (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT);
sqlite> INSERT INTO test (name) VALUES ('张三');
sqlite> INSERT INTO test (name) VALUES ('李四');
sqlite> select * from test;
1|张三
2|李四
sqlite> 

重命名表

ALTER TABLE members RENAME TO users;,将表名从 members 改为 users

重命名列

ALTER TABLE users RENAME COLUMN name TO full_name;,将 name 字段改为 full_name

添加新列

ALTER TABLE users ADD COLUMN email TEXT;,末尾追加 email 字段

删除列

ALTER TABLE users DROP COLUMN age;,删除 age 字段 (需 SQLite 3.35.0+)

下面我们做一个复杂的带外键的情况下,禁用外键的标创建修改数据插入的语法

-- 1. 禁用外键检查 PRAGMA foreign_keys=OFF;

-- 2. 开启事务 BEGIN TRANSACTION;

-- 3. 创建具有目标结构的新表 CREATE TABLE users_new ( user_id INTEGER PRIMARY KEY AUTOINCREMENT, -- 修改了主键逻辑 full_name TEXT, email TEXT DEFAULT 'N/A' );

-- 4. 从旧表迁移数据 INSERT INTO users_new(full_name, email) SELECT full_name, email FROM users;

-- 5. 删除旧表 DROP TABLE users;

-- 6. 将新表重命名为原名 ALTER TABLE users_new RENAME TO users;

-- 7. 提交事务并重新开启外键 COMMIT; PRAGMA foreign_keys=ON;

字段类型SQLite不支持修改
字段类型SQLite不支持修改

字段类型SQLite不支持修改

如果要修改SQLite的字段类型,正确的方案是

1 创建新标

2 迁移数据到新表

INSERT INTO table_new SELECT * FROM table_old;

3 删除旧表

DROP TABLE table_old;

4 重命名新表

ALTER TABLE table_new RENAME TO table_old;

这里有一个问题,如果是大表,那么会导致磁盘IO明显,数据库操作会被锁定,引起生产事故。

在SQLite中,重命名表,和列以及添加删除列都是很快,(需要新版本),修改类型,约束,逐渐都只能删除旧表,创建新表的方式来进行。

这里还有一个问题,表字段类型可以 乱存数据的问题,数字类型存储 字符类型的值在3.37版本之前是可以的。

所以数据库的版本必须是3.37后的版本,这样可以在建立表的时候加上strict

CREATE TABLE users ( id INTEGER PRIMARY KEY, age INTEGER, email TEXT ) STRICT;

是什么类型就是什么类型,下面我们做一个练习看看

代码语言:javascript
复制
sqlite> 
sqlite> CREATE TABLE test (
    id INTEGER PRIMARY KEY,
    age INTEGER,
    email TEXT
);

CREATE TABLE test_strict(
    id INTEGER PRIMARY KEY,
    age INTEGER,
    email TEXT
) STRICT;(x1...> (x1...> (x1...> (x1...> sqlite> sqlite> (x1...> (x1...> (x1...> (x1...> 
sqlite> 
sqlite> 
sqlite> .tables
test         test_strict
sqlite> INSERT INTO test (id,age,email) VALUES ('1','not_a_number',222);
sqlite> select * from test;
1|not_a_number|222
sqlite> 
sqlite> 
sqlite> 
sqlite> INSERT INTO test_strict (id,age,email) VALUES ('1','not_a_number',222);
Runtime error: cannot store TEXT value in INTEGER column test_strict.age (19)
sqlite> 
sqlite 字段类型
sqlite 字段类型

sqlite 字段类型

所以,今天就说到这里,下期咱们继续 ,今天总结

1 SQLite 不能修改字段类型

2 SQLite 需要严格数据类型表,否则什么值都能插入到不对应的字段类型中

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档