Построить определение столбца из таблицы INFORMATION_SCHEMA COLUMNS - PullRequest
1 голос
/ 14 сентября 2011

Я хочу переименовать столбцы в базе данных программно, и MySQL заставляет меня указывать определение столбца в операторе CHANGE.

ALTER TABLE table_name CHANGE old_name new_name column_definition 

Итак, я хочу построить определение столбца из таблицы INFORMATION_SCHEMA. COLUMNS. Я прочитал ответы, которые настраивают меня на анализ вывода SHOW CREATE TABLE table_name, но я не хочу этого делать по некоторым причинам.

Я хочу получить определение столбца как результат одного сценария SQL, если это возможно.

1 Ответ

6 голосов
/ 14 сентября 2011

Попробуйте это:

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';

EDIT Добавлено цитирование значения по умолчанию, сопоставлениеи кодировка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...