什么int类型里面能插入文字,还不能改字段类型--SQLite 五脏俱全系列 (2)
❝开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3400人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6 7 8群已经爆满 9群 300+,开10群PolarDB专业学习群110+ 针对 SQLite 我们将建立一个新的群sqlite的群,如果需要请加群的时候单独告知)
去年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 的方式即可
今天我们先建立一张自增的表并围绕这个表来进行日常语句语法的学习
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的字段类型,正确的方案是
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;
是什么类型就是什么类型,下面我们做一个练习看看
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>所以,今天就说到这里,下期咱们继续 ,今天总结
1 SQLite 不能修改字段类型
2 SQLite 需要严格数据类型表,否则什么值都能插入到不对应的字段类型中
