开发中遇到一个需求,需要将数据库中所有表中的decimal(14,10)类型字段全部改成decimal(22,10),如果逐个去每个表改,工作量还是挺大的,于是上网搜了一下,发下一个sql就可以搞定,如下:

<?php

// 更新sql
$sql = "SELECT CONCAT( 'alter table ', table_name, ' MODIFY COLUMN ', column_name, ' decimal(22,10) DEFAULT NULL;' ) AS execSql, TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.columns a WHERE TABLE_SCHEMA = '".$siteDB."' AND data_type IN ('decimal')";

$return = $this->dbh->query($sql)->fetchAll();
foreach($return as $sql)
{
        try
        {
             $this->dbh->query($sql->execSql);
        }
        catch (PDOException $e)
        {
             echo 'error: '. $e->getMessage() ."exec sql : ".$sql->execSql.PHP_EOL.PHP_EOL;
        }
}

所有的表的字段,以及类型都存储在系统表TABLE_SCHEMA中,sql的意思是从系统表取出类型为decimal的对应的表名,字段名,并拼接了一个alter更新的语句。执行这句sql,就能得到所有的更新sql,接下来只需要遍历执行即可。

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注