如何通过脚本修改SQLite数据库所有文本列的排序规则为RTRIM
批量修改SQLite文本列排序规则为RTRIM的方法
务必先备份你的SQLite数据库文件,防止操作失误导致数据丢失。
以下是用SQLite自带命令行工具实现的简便方法:
- 生成修改脚本:打开终端/命令提示符,执行以下命令(替换
your_db.sqlite为你的数据库文件名):
sqlite3 your_db.sqlite << 'EOF' .mode tabs .output alter_tables.sql SELECT 'ALTER TABLE ' || tbl_name || ' RENAME TO ' || tbl_name || '_old;' || char(10) || 'CREATE TABLE ' || tbl_name || ' (' || group_concat( case when type = 'TEXT' then quote(name) || ' TEXT COLLATE RTRIM ' || case when notnull = 1 then 'NOT NULL ' else '' end || case when pk = 1 then 'PRIMARY KEY ' else '' end || case when dflt_value is not null then 'DEFAULT ' || quote(dflt_value) || ' ' else '' end else quote(name) || ' ' || type || ' ' || case when notnull = 1 then 'NOT NULL ' else '' end || case when pk = 1 then 'PRIMARY KEY ' else '' end || case when dflt_value is not null then 'DEFAULT ' || quote(dflt_value) || ' ' else '' end end, ', ' ) || ');' || char(10) || 'INSERT INTO ' || tbl_name || ' SELECT * FROM ' || tbl_name || '_old;' || char(10) || 'DROP TABLE ' || tbl_name || '_old;' || char(10) FROM sqlite_master JOIN pragma_table_info(tbl_name) WHERE type = 'table' AND tbl_name NOT LIKE 'sqlite_%' GROUP BY tbl_name; .quit EOF
检查脚本:打开生成的
alter_tables.sql文件,确认所有表的修改语句符合预期——比如TEXT列都加上了COLLATE RTRIM,同时保留了原列的NOT NULL、主键、默认值等约束。执行脚本:运行以下命令完成修改:
sqlite3 your_db.sqlite < alter_tables.sql
额外处理(触发器/索引)
如果你的表包含触发器或索引,上述脚本不会自动迁移这些对象,需要额外生成重建语句:
- 将以下SQL添加到生成脚本的查询中,可生成触发器和索引的重建语句:
-- 生成触发器重建语句 SELECT 'CREATE TRIGGER ' || name || ' ' || sql || ';' FROM sqlite_master WHERE type = 'trigger' AND tbl_name NOT LIKE 'sqlite_%'; -- 生成索引重建语句 SELECT 'CREATE ' || case when unique = 1 then 'UNIQUE ' else '' end || 'INDEX ' || name || ' ON ' || tbl_name || ' (' || substr(sql, instr(sql, '(')) || ');' FROM sqlite_master WHERE type = 'index' AND tbl_name NOT LIKE 'sqlite_%';
内容的提问来源于stack exchange,提问作者Bwmat
相关产品推荐
相关产品推荐

