6.1 Изменение структуры базы данных

И наконец самая вкусная часть работы с базами — изменение базы данных. Если ты думаешь, что это что-то очень простое, то вот тебе анекдот в тему:


Мастер СТО, вытирая руки, сдает клиенту машину и попутно болтает:
- А вот вы кем работаете?
- Кардиохирургом, операции на сердце провожу.
- И много платят?
- 20,000$ за операцию.
- Нифига себе... А ведь мы, по сути, одним и тем же занимаемся, движки перебираем, а мне всего 300$ платят...
- Хочешь так же, как я, заработать?
- Хочу...
Хирург заводит движок в машине и обращается к мастеру:
- Перебирай!

С базами данных прямо такая же ситуация. Ты хочешь вынести часть данных в отдельную таблицу? Хорошо, тебе нужно:

  • создать новую таблицу
  • скопировать данные в эту новую таблицу
  • удалить колонки из старой таблицы
  • поменять все SQL-запросы, которые ссылались на старую таблица
  • добавить SQL-запросы, которые будут обращаться к новой таблице
  • поменять Java-код, которые работал с таблицами по-старому
  • поменять сценарии бэкапа и восстановления данных, так как теперь структуры таблиц не совпадают
  • если у тебя есть тестовые данные для разработчиков, нужно поменять и их

Хотя в реальности бывает еще хуже:

Новая структура БД:

  • сначала меняешь структуру таблиц на машине разработчика
  • потом убеждаешься, что такая структура действительно лучше
  • утверждаешь новую структуру БД

Скрипты миграции:

  • пишешь скрипты, которые будут менять таблицые данный и т. д. на реальной базе данных
  • запускаешь эти скрипты на машине со старой структурой базы и смотришь, как она меняется
  • верифицируйшь все критические места новой базы

Апдейт на проде

  • останавливаешь production-базу
  • делаешь полный бэкап
  • выполняешь скрипты
  • так как на проде обычно куча, данных скрипты могут работать часами

Запускаешь прод и надеешься, что тебе не придется все откатывать назад.

6.2 Оператор ALTER TABLE

С другой стороны, сам скрипт, который меняет структуру таблиц, очень простой. Чем-то он похож на скрипт создания таблицы. Общий вид запроса на изменения таблицы:


ALTER TABLE таблица
команда 1,
команда 2,
команда N

        

Команды бывают очень разными, но можно выделить три основные группы:

  • ADD — добавляет что-то в таблицу
  • MODIFY — меняет что-то в таблице
  • DROP — удаляет что-то в таблице

И когда я говорю что-то, то речь идет не о данных, а о структуре таблицы.

Например, ты решаешь добавить в таблицу новую колонку, тогда нужно выполнить такой запрос:


ALTER TABLE таблица
	ADD COLUMN имя тип
        

Давай напишем запрос, который добавит в нашу таблицу employee колонку email:


ALTER TABLE employee
	ADD COLUMN email  VARCHAR(10)
        

Теперь поменяем длину строки email с 10 на 100: для этого нам понадобится новый скрипт:


ALTER TABLE employee
	MODIFY COLUMN email VARCHAR(100)
        

Если ты хочешь поменять какие-то атрибуты колонки, но не ее тип, то тебе нужна команда ALTER COLUM. Давай установим значение email по умолчанию:


ALTER TABLE employee
	ALTER COLUMN email VARCHAR(100)  DEFAULT 'test@test.com'
        

И, наконец, колонку можно удалить, если она тебе не нужна:


ALTER TABLE employee
	DROP COLUMN email 
        

6.3 Добавление и удаление первичного ключа

И еще несколько полезных примеров.

Допустим, мы забыли объявить колонку id первичным ключом. Всегда можно сделать это отдельно через ALTER TABLE:


ALTER TABLE employee
	ADD PRIMARY KEY (email);
        

Удалить его еще проще:


ALTER TABLE employee
	DELETE PRIMARY KEY;
        
undefined
1
Задача
Модуль 4. Работа с БД, 6 уровень, 5 лекция
Недоступна
task0620
Напиши запрос, который добавит в таблицу employee колонку с зарплатой salary с типом INT.
undefined
1
Задача
Модуль 4. Работа с БД, 6 уровень, 5 лекция
Недоступна
task0621
Напиши запрос, который добавит в таблицу employee колонку с зарплатой salary с типом INT и департаментом department с типом VARCHAR(20).
undefined
1
Задача
Модуль 4. Работа с БД, 6 уровень, 5 лекция
Недоступна
task0622
Напиши запрос, который изменит в таблице employee тип колонки с зарплатой (salary) на FLOAT.
undefined
1
Задача
Модуль 4. Работа с БД, 6 уровень, 5 лекция
Недоступна
Удаляем позицию
Напиши запрос, который удалит в таблице employee колонку с позицией (position).
undefined
1
Задача
Модуль 4. Работа с БД, 6 уровень, 5 лекция
Недоступна
task0624
Напиши запрос, который удалит в таблице cities колонку с населением (population).