sqlite数据库如何新增字段、修改字段、删除字段?

热度:4442020-05-25 00:52 收藏 0 点赞 0

近期升级极致CMS版本,也要同时升级sqlite,由于sqlite数据库的特殊性,对于增删查改是比较麻烦的,网上的资料虽然有,但是也没有完全解决我的问题,就算把数据库字段修改了,但是数据库的自增都会被清空,这个是网上sqlite数据库字段操作的一个通病。我研究了一晚上,想到了一个方法可以完美解决这个问题!下面就直接给出源码来吧。(新增字段跟mysql完全一样,这里暂不累述)

整个逻辑是:


判断字段是否不同或者类型是否不同?只要有一个不同,则进行下面字段操作(修改字段及字段类型)


1、获取原数据表结构,并构建创建数据表的SQL语句

//这里newfield表示你要操作的字段,尽量默认值是NULL,不要出现not null
$newfield = '  `newfield` varchar(255) default NULL ';
$sql = "pragma table_info(".DB_PREFIX.$old['molds'].")";
$list = M()->findSql($sql);
$sql = ' create table '.DB_PREFIX.$old['molds'].' (';
//这里id为自增字段,独立拿出来创建
$sql.='`id` INTEGER PRIMARY KEY AUTOINCREMENT ,';
$field_list = [];
$field_list[]='id';
foreach ($list as $v){
        //这里$old['field']表示原表中要进行修改的字段
	if($v['name']!='id' && $v['name']!=$old['field']){
		$sql.=' `'.$v['name'].'` '.$v['type'].' default '.$v['dflt_value'].' , ';
		$field_list[] = $v['name'];
	}
	
}
$sql.=$newfield;
$sql.=');';

2、将原表重命名,成备份表

$step1 = 'ALTER TABLE '.DB_PREFIX.$old['molds'].' RENAME TO '.DB_PREFIX.$old['molds'].'_old ';
M()->runSql($step1);

3、将原数据表结构增加对应的字段类型,创建新表,即将第一步的SQL运行一遍

$r = M()->runSql($sql);

4、从备份表导入数据到新表里面

$step2 = 'insert into '.DB_PREFIX.$old['molds'].' ('.implode(',',$field_list).','.$data['field'].' ) select '.implode(',',$field_list).','.$old['field'].' as '.$data['field'].' from  '.DB_PREFIX.$old['molds'].'_old where 1=1;';

5、删除备份表

$step2 .= "drop table ".DB_PREFIX.$old['molds']."_old;";
$r = M()->runSql($step2);


下面进行的是删除字段操作:

//查询出要操作的自定义字段
$fields = M('fields')->find(array('id'=>$id));
$sql = "pragma table_info(".DB_PREFIX.$fields['molds'].")";
$list = M()->findSql($sql);
$sql = ' create table '.DB_PREFIX.$fields['molds'].' (';
$sql.='`id` INTEGER PRIMARY KEY AUTOINCREMENT ';
$field_list = [];
$field_list[]='id';
foreach ($list as $v){
        //这里只需要排除原来字段,那么剩下的就是新表字段了,注意上下文的逗号(,)放的位置跟修改字段不一样
	if($v['name']!='id' && $v['name']!=$fields['field']){
		$sql.=', `'.$v['name'].'` '.$v['type'].' default '.$v['dflt_value'].' ';
		$field_list[] = $v['name'];
	}
	
}
$sql.=');';
//重命名原表
$step1 = 'ALTER TABLE '.DB_PREFIX.$fields['molds'].' RENAME TO '.DB_PREFIX.$fields['molds'].'_old ';
 M()->runSql($step1);
 
//创建新表
$r = M()->runSql($sql);

//从备份表导入数据
$step2 = 'insert into '.DB_PREFIX.$fields['molds'].' ('.implode(',',$field_list).' ) select '.implode(',',$field_list).'  from  '.DB_PREFIX.$fields['molds'].'_old where 1=1;';
//删除临时数据库
$step2 .= "drop table ".DB_PREFIX.$fields['molds']."_old;";
$r = M()->runSql($step2);


暂无评论
登录后才可以评论~立即登录

如何获取资源?

您可以关注底部公众号,回复文章提示的 “ 关键词 ” 获取对应资源。

每日分享

每日分享收集的网络资源,其中包含开源项目、小工具、常用软件,以及音频视频、电子书籍等。

分享两个远程工具-ToDesk和向日葵

分享两个远程工具-ToDesk和向日葵...

在工作生活中经常用到远程,QQ远程很卡,第三方远程工具就比较方便了。

爱奇艺万能播放器2018年完整版

爱奇艺万能播放器2018年完整版

2018年的爱奇艺万能播放器,功能齐全,没有广告!

分享500套个人求职简历模板

分享500套个人求职简历模板

500套免费求职简历下载!

一款最近很火的自动跳过广告APP,无root直装版

一款最近很火的自动跳过广告APP,...

自动跳过广告,无需root

WPS免费去广告电脑软件

WPS免费去广告电脑软件

wps广告实在太多了,下载一个去广告版本

强制突破进入好友QQ空间

强制突破进入好友QQ空间

一款突破好友进入QQ空间的软件