由于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);
版权声明:本文发布于与老涂一起写代码 内容均来源于互联网 如有侵权联系删除
快来评论,快来抢沙发吧~