【问题标题】:Mysql - Rename all tables and columns to lower case?Mysql - 将所有表和列重命名为小写?
【发布时间】:2011-02-23 21:12:51
【问题描述】:

我最近将一个数据库从 windows 机器转移到了 linux 机器。这些表在小写和大写名称之间混合使用。我需要一种将所有表和列重命名为小写的方法。这可能吗?

我在this SO answer 中看到了表是可能的,但没有找到任何处理列名的东西。

【问题讨论】:

  • +1,CamelCase 让你的世界颠倒......

标签: mysql mysql-management


【解决方案1】:

您可以尝试对 Information_Schema.Columns 表执行完全相同的操作

编辑: 类似的东西

SELECT CONCAT('ALTER TABLE ', TABLE_NAME, ' CHANGE `', COLUMN_NAME, '` `',
LOWER(COLUMN_NAME), '` ', COLUMN_TYPE, ';')
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '{your schema name}'

【讨论】:

  • 似乎不起作用;命令似乎已成功,但 describe **tablename** 显示大写列。
  • 当然,也许我只需要重新启动 MySQL。我在共享主机上执行此操作,所以不确定是不是这样。
  • 它最初对我不起作用,因为 Mac 上的 TextEdit 与单引号混淆。在复制和粘贴过程中,它们被更改为其他内容。
  • 例如,我认为此查询不考虑具有自动增量的主键列。 “COLUMN_TYPE”不包括列的自动增量或默认值。
  • 警告:所有具有自动增量的列都将失去自动增量
【解决方案2】:

您可以使用 Anders Eriksson 在MySQL Website 上提出的这个脚本:

 select concat('rename table ', table_name, ' to ' , lower(table_name) , ';') from information_schema.tables where table_schema = 'your_schema_name';

【讨论】:

  • 所以,当我这样做并运行后续结果时,它告诉我该表已经存在。
【解决方案3】:

可能使用了内置函数 LOWER() UPPER()。 http://www.sqlinfo.net/mysql/mysql_function_upper_lower.php

alter table [table name] change [old column name] [new column name] varchar (50);

【讨论】:

    【解决方案4】:

    上述解决方案对我来说还不够完整。他们删除了 auto_increment、默认值和 Not Null 等列属性。此外,我不想更改 information_schema 和 mysql 中的列。

    警告:我没有研究所有列属性组合。只是允许我转换我的数据库的集合。您的数据库中可能有更多常量,例如 CURRENT_TIMESTAMP。

    我使用下面的一些变体来确定我的数据库中的内容。

    SELECT distinct COLUMN_DEFAULT FROM information_schema.columns
    

    这是对我有用的解决方案:

    select 
    CONCAT('ALTER TABLE ', '`', t.TABLE_NAME, '`', ' CHANGE `', c.COLUMN_NAME, '`',
        ' `', LOWER(`COLUMN_NAME`), '` ', COLUMN_TYPE,
    IF (IS_NULLABLE = "YES", ' ', ' NOT NULL'), 
    IF (IS_NULLABLE = "YES",
        IF (COLUMN_DEFAULT IS NULL, 'DEFAULT NULL', IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', ' DEFAULT CURRENT_TIMESTAMP', CONCAT(' DEFAULT ', '''', COLUMN_DEFAULT, ''''))),
        IF (COLUMN_DEFAULT IS NOT NULL, IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', ' DEFAULT CURRENT_TIMESTAMP', CONCAT(' DEFAULT ', '''', COLUMN_DEFAULT, '''') ), '') ) ,
    ' ', EXTRA, ';')
    from 
    information_schema.tables t
    JOIN 
    information_schema.columns c
    ON (c.table_name = t.table_name)
    WHERE t.table_type = 'BASE TABLE'
    AND t.table_schema not in ('information_schema', 'mysql')
    INTO OUT FILE '/tmp/ColumnsToLowerCase.sql'
    

    省时注意事项: 要输出到文件,您必须以足够的权限登录到数据库。 我有 root 访问权限,所以我以 root 身份登录,但如果你必须的话,剪切和过去的结果也可以。

    【讨论】:

    • 这很好用,但我需要将 DISTINCT 关键字添加到选择中,否则我会返回重复的记录。
    【解决方案5】:

    好的,我已经修改了 Dave Benson 的答案以添加 DISTINCT 关键字(以防止返回重复记录)并检查可为空的时间戳列。

    SELECT DISTINCT
        CONCAT('ALTER TABLE ', '`', t.TABLE_NAME, '`', ' CHANGE `', c.COLUMN_NAME, '`', ' `', LOWER(`COLUMN_NAME`), '` ', COLUMN_TYPE,
    IF (IS_NULLABLE = "YES", ' ', ' NOT NULL'), IF (IS_NULLABLE = "YES", IF (COLUMN_DEFAULT IS NULL, IF (COLUMN_TYPE = 'TIMESTAMP', 'NULL DEFAULT NULL', 'DEFAULT NULL'), IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', ' DEFAULT CURRENT_TIMESTAMP', CONCAT(' DEFAULT ', '''', COLUMN_DEFAULT, ''''))), IF (COLUMN_DEFAULT IS NOT NULL,IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', ' DEFAULT CURRENT_TIMESTAMP', CONCAT(' DEFAULT ', '''', COLUMN_DEFAULT, '''')),'')), ' ', EXTRA, ';')
    FROM information_schema.tables t
    JOIN information_schema.columns c ON (c.table_name = t.table_name)
    WHERE t.table_type = 'BASE TABLE'
    AND c.table_schema not in ('information_schema', 'mysql')
    INTO OUT FILE '/tmp/ColumnsToLowerCase.sql'
    

    【讨论】:

      【解决方案6】:

      @Dave Benson 的更好版本,它只获取您的数据库表并修复 Current_timestamp

      select
      CONCAT('ALTER TABLE ', '`', t.TABLE_NAME, '`', ' CHANGE `', c.COLUMN_NAME, '`',
          ' `', LOWER(`COLUMN_NAME`), '` ', COLUMN_TYPE,
      IF (IS_NULLABLE = "YES", ' ', ' NOT NULL'),
      IF (IS_NULLABLE = "YES",
          IF (COLUMN_DEFAULT IS NULL, 'NULL DEFAULT NULL', IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', 'NULL DEFAULT CURRENT_TIMESTAMP', CONCAT(' NULL DEFAULT ', '''', COLUMN_DEFAULT, ''''))),
          IF (COLUMN_DEFAULT IS NOT NULL, IF (COLUMN_DEFAULT = 'CURRENT_TIMESTAMP', ' DEFAULT CURRENT_TIMESTAMP', CONCAT(' DEFAULT ', '''', COLUMN_DEFAULT, '''') ), '') ) ,
      ' ', EXTRA, ';')
      from
      information_schema.tables t
      JOIN
      information_schema.columns c
      USING(`table_name`, `table_schema`)
      WHERE t.table_schema = 'YOUR_DATABASE_NAME'
      ORDER BY `TABLE_NAME` ASC
      

      【讨论】:

        猜你喜欢
        • 2017-11-08
        • 2020-03-06
        • 2011-12-08
        • 1970-01-01
        • 2011-04-07
        • 2021-10-08
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多