首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改整个数据库中列的数据类型- MySQL

更改整个数据库中列的数据类型- MySQL
EN

Stack Overflow用户
提问于 2016-02-25 08:28:59
回答 4查看 7K关注 0票数 2

我是MySQL的新手。我设计了几个带有Char数据类型的表。现在,我希望将所有Char数据类型列更改为具有char中提到的相应大小的Varchar。

代码语言:javascript
复制
For example.
Existing - Phone Char(10) 
Expected - Phone Varchar(10)

大约有50多张桌子。我知道如何更改每个表和列的数据类型,但是否有更好的方法在一次尝试中更改数据类型。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-02-25 09:42:12

如果你不能写一个脚本来做这个工作,写一个脚本来完成这个工作!

您需要一堆ALTER语句:

代码语言:javascript
复制
SET SESSION group_concat_max_len = 1000000; -- Bumps the limit of 1028
SELECT GROUP_CONCAT(
    CONCAT(
        'ALTER TABLE `',
        table_name,
        '` MODIFY COLUMN `',
        column_name,
        '` VARCHAR(',
        character_maximum_length,
        ')'
    )
SEPARATOR ';\n') your_alter_statements
FROM information_schema.columns
WHERE table_schema = 'concrete'
AND data_type = 'char';

这将导致:

代码语言:javascript
复制
ALTER TABLE `table1` MODIFY COLUMN `col1` VARCHAR(10);
ALTER TABLE `table1` MODIFY COLUMN `col2` VARCHAR(10);
ALTER TABLE `table2` MODIFY COLUMN `col1` VARCHAR(10);
ALTER TABLE `table3` MODIFY COLUMN `col1` VARCHAR(10);
ALTER TABLE `table3` MODIFY COLUMN `col2` VARCHAR(10);

快跑,你可以早点回家!

UPDATE:通过添加group_concat_max_len停止截断。根据列的长度使长度动态。

票数 4
EN

Stack Overflow用户

发布于 2016-02-25 09:55:04

MySQL只有一个班轮解决方案:

代码语言:javascript
复制
SELECT 'ALTER TABLE ',TABLE_NAME, ' MODIFY COLUMN ',COLUMN_NAME, CONCAT(' VARCHAR(', CHARACTER_MAXIMUM_LENGTH, ');')
    FROM INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'char' AND TABLE_SCHEMA='concrete'

上面的查询将返回所有ALTER TABLE语句,如下所示:

代码语言:javascript
复制
ALTER TABLE     tablename1   MODIFY COLUMN  col_name1    VARCHAR(17);
ALTER TABLE     tablename2   MODIFY COLUMN  col_name2    VARCHAR(17);
ALTER TABLE     tablename3   MODIFY COLUMN  col_name3    VARCHAR(60);

复制结果行并执行,这样您就可以更早地回家。

此外,下面是PHP/MySQL解决方案:

代码语言:javascript
复制
// Initialise Connection
define('DB_HOST', 'HOST_NAME_HERE');
define('DB_NAME', 'DB_NAME_HERE');
define('DB_USER_NAME', 'DB_USER_NAME_HERE');
define('DB_PASSWORD', 'DB_PASSWORD_HERE');

$pdo = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER_NAME, DB_PASSWORD, [
    PDO::ATTR_PERSISTENT => false,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
]);

// Get a list of CHAR columns
$sql = "SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE, COLUMN_DEFAULT
        FROM INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'char' AND TABLE_SCHEMA='" . DB_NAME . "'";

$stmt = $pdo->prepare($sql);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);

// Change CHAR to VARCHAR
foreach ($data as $rec) {
    $ddq = 'ALTER TABLE ' . $rec['TABLE_NAME'] . ' CHANGE ' . $rec['COLUMN_NAME'] . ' ' . $rec['COLUMN_NAME'] . ' VARCHAR(' .
           $rec['CHARACTER_MAXIMUM_LENGTH'] . ') ' . ($rec['IS_NULLABLE'] == 'YES' ? 'NULL' : 'NOT NULL') . (isset($rec['COLUMN_DEFAULT']) ? " DEFAULT '{$rec['COLUMN_DEFAULT']}'" : '');
    $pdo->query($ddq);
}
票数 1
EN

Stack Overflow用户

发布于 2016-02-25 09:48:33

在分析了web之后,我得到了答案,并使用这个查询更改了数据类型。

代码语言:javascript
复制
select 
concat('ALTER TABLE ', table_name,' MODIFY COLUMN ', column_name,' ', REPLACE (column_type, 'char', 'varchar'),';')
from information_schema.columns
where 
data_type='char' 
and table_schema='DBName';
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35622020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档