Перейти к основному содержимому
Модуль 9 · Урок 3 из 435/57 в курсе~10 min
Уроки модуля (3/4)

Изменение структуры: ALTER TABLE

Потребности приложения со временем меняются, и база данных должна идти в ногу со временем. ALTER TABLE — это (чрезвычайно универсальная) команда, предназначенная для изменения существующих схем таблиц без их удаления (рискуя данным внутри).

Изменение столбцов (ДОБАВИТЬ/УДАЛИТЬ/ИЗМЕНИТЬ)

Добавление столбца требует осторожности. Если таблица уже содержит данные, добавление столбца «NOT NULL» приведет к ошибке в Postgres: что ему следует вставить в старые строки? Вы должны связать DEFAULT.

SQL
-- Aggiungiamo una colonna
ALTER TABLE users ADD COLUMN age INTEGER; -- Ok, sarà NULL ovunque

-- Aggiungiamo NOT NULL, quindi diamogli un deafult
ALTER TABLE users ADD COLUMN active BOOLEAN NOT NULL DEFAULT true;

-- Cancellare una colonna (ATTENZIONE! i dati andranno persi)
ALTER TABLE users DROP COLUMN age;

Не просто добавление или удаление: вам часто нужно перенастроить type столбца или одно из его ограничений:

SQL
-- Cambia il tipo di dato (postgreSQL farà un 'cast' dei dati esistenti se possibile)
ALTER TABLE users ALTER COLUMN username TYPE VARCHAR(100);

-- Aggiunge il vincolo NOT NULL
ALTER TABLE users ALTER COLUMN username SET NOT NULL;

-- Rimuove il vincolo NOT NULL (ritorna ad accettare null)
ALTER TABLE users ALTER COLUMN username DROP NOT NULL;

Добавление ограничений во время выполнения

Как и в случае с CREATE TABLE, мы можем использовать ALTER TABLE, чтобы прикрепить CONSTRAINT к таблице, которая уже используется в рабочем приложении.

SQL
-- Aggiungi un nuovo Foreign Key
ALTER TABLE orders
  ADD CONSTRAINT fk_order_status FOREIGN KEY (status_id) REFERENCES statuses(id);

-- Aggiungi un CHECK
ALTER TABLE products
  ADD CONSTRAINT price_positive CHECK (price > 0);

-- E per distruggerli?
ALTER TABLE products DROP CONSTRAINT price_positive;

Переименование

И столбцы, и таблицы можно переименовывать:

SQL
ALTER TABLE users RENAME TO auth_users;
ALTER TABLE auth_users RENAME COLUMN username TO login_name;

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

Упражнение#sql.m9.l3.e1
Попыток: 0Загрузка…

В таблице «Продукты» в настоящее время есть столбец «Имя». Измените таблицу, переименовав столбец «имя» в «заголовок». Используйте операцию RENAME COLUMN.

Загрузка редактора…
Показать подсказку

Синтаксис: ALTER TABLE... RENAME COLUMN... TO...

Решение доступно после 3 попыток

Добавление ограничений при постобработке

Упражнение#sql.m9.l3.e2
Попыток: 0Загрузка…

Измените таблицу «продукты», добавив ограничение CHECK (с именем «verifica_prezzo»), которое требует, чтобы цена (столбец «цена») была больше 0. Ограничение необходимо добавлять, не удаляя исходный столбец.

Загрузка редактора…
Показать подсказку

Синтаксис: Таблица ALTER TABLE ADD CONSTRAINT имя CHECK (...)

Решение доступно после 3 попыток