与老涂一起写代码

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

admin 156 ℃ 0 条
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);

 

发表评论 (已有0条评论)

快来评论,快来抢沙发吧~