Уяви, що ти проєктуєш базу даних для університету. Спочатку таблиця студентів містить лише два поля: ID та ім'я. Все просто, студенти починають користуватись системою. Але через місяць до тебе приходять викладачі й кажуть: "А можна ще додати вік?", а трохи пізніше: "Потрібен ще email". Ну а потім: "А давайте приберемо, нарешті, поле middle_name, все одно його ніхто не заповнює!". Ось тут тобі й знадобляться навички роботи з ALTER TABLE для додавання та видалення стовпців.
Синтаксис додавання стовпців
Отже, щоб додати новий стовпець у вже існуючу таблицю PostgreSQL, використовується команда ALTER TABLE. Дивимось на синтаксис:
ALTER TABLE table_name
ADD COLUMN column_name data_type [constraints];
table_name— ім'я таблиці, в яку ти хочеш додати новий стовпець.column_name— ім'я стовпця, який ти хочеш додати.data_type— тип даних, наприклад,VARCHAR,INTEGERабоDATE.constraints(необов'язковий параметр) — обмеження, які ти хочеш накласти на цей стовпець, наприклад,NOT NULL,DEFAULTі т.д.
Приклад: додаємо новий стовпець
Припустимо, у нас є таблиця students, яку ми створили раніше:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
Раптово з'явилась задача додати стовпець age для зберігання віку студентів. Ось як це робиться:
ALTER TABLE students
ADD COLUMN age INTEGER;
Тепер структура таблиці students стане такою:
| id | name | age |
|---|---|---|
| 1 | Eva | NULL |
| 2 | Alex | NULL |
Якщо нові записи додавати без вказання віку, то PostgreSQL автоматично поставить значення NULL, бо ми не вказали жодних обмежень типу NOT NULL чи значень за замовчуванням (DEFAULT).
Синтаксис видалення стовпців
Видалення стовпця з таблиці теж робиться за допомогою команди ALTER TABLE. Ось її синтаксис:
ALTER TABLE table_name
DROP COLUMN column_name [RESTRICT | CASCADE];
table_name— ім'я таблиці, з якої ти хочеш видалити стовпець.column_name— ім'я стовпця, який видаляється.RESTRICT— заборона видалення стовпця, якщо на нього є посилання (за замовчуванням).CASCADE— видалення стовпця разом з усіма залежностями.
Про каскадне видалення залежностей я розповім детальніше на наступному рівні :P
Приклад: видаляємо непотрібний стовпець
Повертаємось до таблиці students. Ми вирішили, що поле age більше не потрібно. Видаляємо його:
ALTER TABLE students
DROP COLUMN age;
Тепер структура таблиці знову спрощується:
| id | name |
|---|---|
| 1 | Eva |
| 2 | Alex |
Корисні приклади
Додавання стовпця з constrains
А якщо б ти все ж таки захотів додати стовпець age, але з обмеженням NOT NULL і значенням за замовчуванням? Тобі підійде такий код:
ALTER TABLE students
ADD COLUMN age INTEGER NOT NULL DEFAULT 18;
Тепер у всіх існуючих рядках для стовпця age встановиться значення 18, а нові записи вимагатимуть обов'язкового вказання значення для цього поля, якщо не використовується значення за замовчуванням.
Видалення стовпця із залежностями
Якщо у якогось стовпця є залежності (наприклад, він використовується у view або trigger), доведеться використати модифікатор CASCADE. Але будь обережний: це може зачепити інші об'єкти у твоїй базі. Наприклад:
ALTER TABLE students
DROP COLUMN email CASCADE;
Типові помилки та особливості
Помилка: додавання стовпця з неправильним типом даних.
Уяви, що ти додаєш стовпець з типом INTEGER, але намагаєшся зберігати в ньому текстові дані. PostgreSQL тебе не зрозуміє і видасть помилку при додаванні записів. Тип даних завжди має відповідати вмісту.
Помилка: видалення стовпця без урахування залежностей.
Наприклад, якщо ти видалиш стовпець, на який посилаються індекси або зовнішні ключі, PostgreSQL може видати помилку, якщо не вказано модифікатор CASCADE.
Помилка: видалення стовпця із залежностями. Наприклад, якщо ти видалиш стовпець, на який посилаються індекси або зовнішні ключі, PostgreSQL може видати помилку, якщо не вказано модифікатор CASCADE. Ти його додав і видалив тисячі рядків, які посилались на твою видалену колонку. Які не треба було видаляти : (
Особливість: порядок виконання змін.
Іноді додавання стовпців з обмеженнями може вимагати знань про порядок виконання операцій. Наприклад, якщо ти додаєш стовпець з NOT NULL, то спочатку треба заповнити його значеннями за замовчуванням, інакше PostgreSQL видасть помилку.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ