#mysql
#mysql
Вопрос:
Пожалуйста, обратите внимание: мне нужно сделать это программно.Я не помечал ни один язык программирования, поскольку используемый язык не имеет значения.
Мне нужно написать функцию, которая, учитывая любой столбец из любой таблицы, изменит этот столбец так, чтобы он принимал NULL (а не NOT NULL), или изменит его тип данных (полностью изменив его или предоставив больше места для VARCHAR).
Я упомяну только значение NULL / NOT NULL для простоты.
Я знаю, что я могу сделать:
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='jobs';
Или более простой:
SHOW COLUMNS FROM `jobs`;
Я могу запустить это через узел (но то же самое относится и к PHP или чему-то еще) и получить данные обратно.
Так, например, я могу знать, что job
у него есть столбец с именем ‘name’ и что он НЕ имеет NULL.
Я понимаю, что могу бежать ALTER TABLE jobs ...
. Однако я хочу оставить таблицу заданий без изменений, кроме ‘NOT NULL’; однако ALTER TABLE
ожидается полное определение для таблицы.
В принципе, насколько я могу судить, мне нужно:
- Извлеките определение столбца из
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='jobs';
и поместите его в структуру данных - Измените возвращаемое определение (например, YES, а не NO в ключе ‘Null’)
- Создайте оператор ALTER TABLE, который отражает измененную структуру
- Проблема с этим оператором ALTER TABLE
Это правильный путь? Если да, то как мне получить полный оператор ALTER TABLE, начиная с данных, которые я получил о таблице?
Или, есть ли способ внести «жесткие изменения» через API без выдачи инструкции ALTER TABLE?
Комментарии:
1. Я бы сделал это программно
show create table yourtablename
и нашел строку для изменения столбца. синтаксический анализ и изменение только типа или обнуляемости должны быть довольно простыми. затем добавьтеalter table yourtablename modify column
и запустите ее2. По этому вопросу мне бы очень хотелось узнать, почему, черт возьми, он был отклонен. Серьезно
3. Это был не я. Люди голосуют странно, особенно по вопросам
Ответ №1:
Определенно нет способа изменить тип или обнуляемость или другие атрибуты столбца без использования ALTER TABLE
.
Вы можете выполнить ALTER TABLE
инструкцию программно, через тот же API, который вы используете для выполнения запросов из любого кода клиентского приложения.
Я думаю, вы ошибаетесь, когда говорите ALTER TABLE
, что требуется полное определение для таблицы. Для этого требуется полное определение столбца, который вы хотите изменить. Но вам не нужно упоминать другие столбцы. Они остаются неизменными.
Вы можете использовать дополнительные условия вашего предложения WHERE, чтобы получить только сведения для определенного столбца:
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name='jobs'
AND column_name='name';
Комментарии:
1. Я имел в виду «Полное определение столбца». Однако я не буду менять вопрос, чтобы ваш ответ по-прежнему имел смысл. И спасибо за ответ!
2. Хорошо, я подумал, что вы, возможно, имели в виду это, но тогда ваш запрос information_schema не ограничивался именем столбца, и я подумал, что вы извлекаете все детали для всех столбцов и формируете большой оператор ALTER TABLE для всех столбцов. Не обязательно — но я видел, как люди делают подобные вещи.