从INFORMATION_SCHEMA COLUMNS表构建列定义

时间:2011-09-14 15:49:42

标签: mysql sql

我想以编程方式重命名数据库中的列,MySQL强制我在CHANGE语句中指定列定义。

ALTER TABLE table_name CHANGE old_name new_name column_definition 

所以,我想从INFORMATION_SCHEMACOLUMNS表构建列定义。我已经阅读了调整我来解析SHOW CREATE TABLE table_name输出的答案,但我不想因为某些原因这样做。

如果可能的话,我希望将列定义作为单个SQL脚本的结果。

1 个答案:

答案 0 :(得分:6)

试试这个:

select COLUMN_TYPE from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '{database name}' AND TABLE_NAME = '{table name}' AND COLUMN_NAME = '{column name}';

您需要填写正确的值,但它应该为您提供填写ALTER语句所需的精确字符串。您将需要做一些额外的工作来处理默认语句和NULL设置。

完整的样本:

SELECT CONCAT(
      CAST(COLUMN_NAME AS CHAR),
      ' ',
      CAST(COLUMN_TYPE AS CHAR),
      IF(ISNULL(CHARACTER_SET_NAME),
         '',
         CONCAT(' CHARACTER SET ', CHARACTER_SET_NAME)),
      IF(ISNULL(COLLATION_NAME), '', CONCAT(' COLLATE ', COLLATION_NAME)),
      ' ',
      IF(IS_NULLABLE = 'NO', 'NOT NULL ', ''),
      IF(IS_NULLABLE = 'NO' AND ISNULL(COLUMN_DEFAULT),
         '',
         CONCAT('DEFAULT ', QUOTE(COLUMN_DEFAULT), ' ')),
      UPPER(extra))
      AS column_definition
 FROM INFORMATION_SCHEMA.COLUMNS
WHERE  TABLE_SCHEMA = 'table_schema'
   AND TABLE_NAME = 'table_name'
   AND COLUMN_NAME = 'column_name';

编辑添加了默认值,排序规则和字符集的引用。