【奇葩的需求】对整个数据库里的所有表的所有字段的数据操作

哎,因为图片服务器的网址变了,所以让把数据库里所有表所有字段的数据里的旧网址替换成新网址,所以就只能写了这么一个代码,貌似效率还不错,20多W的数据量,只用了13秒,好的代码不需要太多的文字来解释

<?php 
class TestAction extends Action{
	private $old_str=‘‘;
	private $new_str=‘‘
	function index(){
		set_time_limit(0);
		$tableList=$this->getTables();
		foreach($tableList as $k=>$v){
			//如果没有数据则直接执行
			if($this->getDataList($v)){
				//获取表字段
				$fieldList=$this->getFieldInfo($v);
				$list=$this->db_replace($v,$fieldList);
				dump($list);
			}
		}
	}

	private function getTables(){
		$model=D(‘Api‘);
		$tableList=$model->getTables();		//获取所有表名
		//处理表名称
		foreach($tableList as $k=>$v){
			if(substr($v,0,strlen(C(‘DB_PREFIX‘)))!==C(‘DB_PREFIX‘))
				unset($tableList[$k]);
			else
				$tableList[$k]=str_replace(C(‘DB_PREFIX‘),‘‘,$v);
		}
		return $tableList;
	}
	//获取字段信息
	private function getFieldInfo($table){
		$model=D($table);
		$list=$model->getDbFields();
		return $list;
	}
	//查询表中是否有数据
	private function getDataList($table){
		$model=D($table);
		$list=$model->select();
		if($list)
			return true;
		else
			return false;
	}
	//执行替换
	private function db_replace($table,$field){
		$tableName=C(‘DB_PREFIX‘).$table;
		$field=$this->db_filter($field);
		if(!empty($field)){
			foreach($field as $k=>$v){
				$sql="UPDATE `$tableName` SET `$v` = REPLACE ( `$v`, ‘$this->old_str‘, ‘$this->new_str‘ ); ";
				if(M()->execute($sql))
					$ok[]=‘替换完成,替换表为.‘.$tableName.‘|替换字段为‘.$v.‘<br />‘;
			}
		}
		return $ok;
	}

	//字段过滤
	private function db_filter($field){
		$in=array(‘id‘,‘name‘,‘title‘,‘token‘,‘wecha_id‘,‘pid‘,‘level‘,‘uid‘);
		foreach($field as $k=>$v){
			if(in_array($v,$in)){
				unset($field[$k]);
			}
		}

		return $field;
	}
}

欢迎加群:252799167

时间: 2024-11-16 05:03:00

【奇葩的需求】对整个数据库里的所有表的所有字段的数据操作的相关文章

hibernate 向数据库里设置了默认值的字段添加数据为null时失效的问题

写ssh项目时设置了一个boolean类型的字段,想让他添加的时候默认为1 结果添加的时候不输入数据的话会将null转成0添加 最后再映射hbm文件里的property下设置insert=false 并且设置其非空,默认值生效 <property>元素 insert属性:设置为false,在insert语句中不包含这个字段,表示永远不会被插入 原文地址:https://www.cnblogs.com/King-Jin/p/10961640.html

update忘了加where条件,不小心把oracle数据库里某张表的全表数据都更新了怎么办?

问题描述:数据库突然出问题了,一张物资价格表全部更新成了同一个价格,13万条数据 跟大家分享一下我自己跳的坑,希望对遇到类似问题的小伙伴有一点点帮助.ps:属于技术比较low的,所以自己进的坑比较深,解决方法可以直接看6和8 1.首先客户有数据库备份,每天凌晨都有数据库备份,我们没有dba权限,客户通过数据库监控日志查出18号有一个13万数据的update没有加where条件,给了我备份的数据库文件. 2.创建了新的表空间,表用户,导入18号的数据库(我的电脑上装了oracle服务) eg:创建

MySQL Workbench 创建数据库,添加新表,添加字段

建立数据库 第一步: 第二步: 第三步: 如图弹出弹框,继续点击Apply按钮,最后点击Finish按钮完成数据库的建立 创建表与添加字段 双击!!!  一下刚刚建立好的数据库,然后再创建表,不然会出错,右键点击Tables 然后点击Create new tables ,填写表名,以及字段的信息,之后点击  apply ,一张表就建完了. PK: primary key (column is part of a pk)  主键 NN: not null (column is nullable) 

C#里怎样把一个DataTable的数据追加进数据库里的某个表

方法一: DataTable table = new DataTable(); //TODO: init table... string connStr = "user id=" + dbInfo.UserName + ";data source=" + dbInfo.DBServerIP + ";persist security info=False;initial catalog=" + dbInfo.DatabaseName + "

从数据库统计出某张表中某个字段重复次数

最近有一个新需求就是在数据表里面查询出某个字段重复了多少次进而对其进行排名分析,那么问题来了,SQL该怎么写呢 既然要统计次数肯定要用到COUNT,那么最后得到的SQL就是 SELECT TOP 100 field1,field1Count = COUNT(field1) FROM table1 GROUP BY field1 ORDER BY field1Count DESC 这句SQL的意思就是从table1中统计出field1字段冲重复次数并选出排名前100的field1 好记性不如烂笔头

用python操作mysql数据库(之简单“插入数据”操作)

#!/usr/bin/env python # -*- coding: utf-8 -*- ''' 1.这里的数据库环境为本地数据库 2.我要通过python操作的数据库是test_db 3.该数据库里有一个表,表名称:user 4.表字段:id.name.address 5.其中,id字段为自增,也是主键 6.因ID字段为自曾,所以在插入数据的时候会自己增加数字,所以在这里不用额外再插入数据 ''' import MySQLdb #建立连接 conn = MySQLdb.connect(hos

【数据库】分库分表

一. 水平分表:当一张表里数据过多时,就可以考虑水平分表了. 水平分表一般按照表的某一字段进行切分,如按照时间,每个月的数据单独放一张表里,表名加上时间进行标识 水平分表适用于单表数据量大,且查询最好单表查询,如按时间切分,则查询时时间跨度最好在一个月里面,如果跨度大则需要多表联查,联查的表越多性能就越差,就体现不出分表的价值了 二.垂直分表 :当一张表里的字段过多时,就可以考虑垂直分表了. 垂直分表可以将常用的字段放一张表里,不常用的字段放另一张表里,多表之间的关联可以用guid来做,当然要打

EntityFramework Code-First 简易教程(十一)-------从已存在的数据库中映射出表

怎样从一个已存在的数据库中映射表到 entity 实体? Entity Framework 提供了一个简便方法,可以为已存在的数据库里的所有表和视图创建实体类(entity class),并且可以用 DataAnnotation 特性和 Fluent API 来配置. 首先,右键你的 Visual Studio 项目 -> 添加 -> 新建项目: 选择 ADO.NET实体数据模型(ADO.NET Entity Data Model ),并指定模型名称(这个名称将会是 contenxt 类的类名

关于数据库创建时间和更新时间的字段名 created_at updated_at

很多国内CMS程序都喜欢把数据库里创建时间和更新时间字段命名为create_time和update_time 国外喜欢命名为 created_at和updated_at,比如YII.Laravel框架 我打算在新的项目里开始使用 created_at和updated_at 原文地址:https://www.cnblogs.com/Club/p/created_at-updated_at.html