Неделя 1
Учебное пособие - Бинариум
Изменение таблиц
Книга 3
ALTER TABLE — обзор

ALTER TABLE — единственная команда для всех изменений структуры существующей таблицы: от добавления столбцов до управления ограничениями.

#️⃣ Полный синтаксис

💡 Важно

В отличие от CREATE TABLE, который создаёт таблицу с нуля, ALTER TABLE работает с уже существующей таблицей, которая может содержать данные. Это накладывает ограничения: например, нельзя добавить NOT NULL к столбцу, где уже есть NULL-значения.

Добавление столбца
Оператор ADD позволяет добавить один или несколько новых столбцов в уже существующую таблицу.

#️⃣ Синтаксис

#️⃣ Пример

  • Указать таблицу
    После ALTER TABLE пишем имя существующей таблицы.
  • Написать ADD
    Ключевое слово ADD сигнализирует о добавлении нового столбца.
  • Задать имя и тип
    Укажите имя нового столбца и его тип данных — точно как в CREATE TABLE.
  • Атрибуты (опционально)
    Можно добавить DEFAULTNOT NULLUNIQUE и другие атрибуты.

⚠ Осторожно

Если вы добавляете столбец с NOT NULL в таблицу, где уже есть строки, необходимо указать DEFAULT — иначе SQL вернёт ошибку, так как существующие строки получат NULL.

Модификация столбца

ALTER COLUMN позволяет изменить тип данных существующего столбца, его дефолтное значение или атрибуты.

#️⃣ Синтаксис

#️⃣ Пример

  • ✓ Безопасно

    Расширять VARCHAR — увеличение VARCHAR(50) до VARCHAR(255) не затрагивает существующие данные.

  • ✗ Рискованно
    Сужать VARCHAR или менять INT на VARCHAR — если существующие данные не соответствуют новому типу, получите ошибку.
  • ✓ Безопасно
    Задавать SET DEFAULT — добавление дефолтного значения никак не влияет на уже имеющиеся строки.
  • ⚠ Проверьте
    Добавлять NOT NULL — убедитесь, что в столбце нет NULL-значений, иначе команда завершится с ошибкой.
Внешние ключи FOREIGN KEY
Внешний ключ устанавливает связь между столбцом одной таблицы и первичным ключом другой — обеспечивая ссылочную целостность.

#️⃣ Синтаксис

#️⃣ Пример — схема Заказы → Клиенты

#️⃣ Как это работает

  • orders.customer_id → customers.id
    Каждый customer_id в таблице orders должен существовать как id в таблице customers. Нельзя вставить заказ с несуществующим клиентом.
  • Защита целостности
    Нельзя удалить клиента из customers, если у него есть связанные заказы в orders — это нарушило бы ссылочную целостность.

💡 REFERENCES

Ключевое слово REFERENCES указывает на целевую таблицу и столбец. Целевой столбец должен быть первичным ключом или иметь ограничение UNIQUE.

Ограничения CONSTRAINT
Именованные ограничения удобнее удалять и изменять — вы можете управлять ими по имени в будущем.

#️⃣ Синтаксис

PRIMARY KEY (ПЕРВИЧНЫЙ КЛЮЧ)

UNIQUE (УНИКАЛЬНОСТЬ)

CHECK (УСЛОВИЕ)

FOREIGN KEY (ВНЕШНИЙ КЛЮЧ)

💡 Зачем давать имена?

Именованные ограничения легко удалять: DROP CONSTRAINT customer_age_chk — понятнее, чем искать автоматически сгенерированное имя. Особенно важно в командной работе и при миграциях.

DROP и WITH NOCHECK
Удаление ограничений и специальный режим обхода проверки существующих данных.

#️⃣ Удаление ограничений — DROP

#️⃣ Проверка данных при добавлении ограничений


При добавлении ограничений SQL Server автоматически проверяет имеющиеся данные. Если они не соответствуют — ограничение не добавляется.

#️⃣ Когда использовать WITH NOCHECK?

  • Миграция БД

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

  • Временный обход
    Когда вы знаете о "грязных" данных и планируете их очистить после — но уже хотите ввести правила для новых записей.
  • Не злоупотреблять
    WITH NOCHECK создаёт скрытую проблему: в таблице есть данные, нарушающие ваши же ограничения. Очищайте их как можно скорее.
  • Производительность
    На очень больших таблицах проверка всех строк занимает время. NOCHECK позволяет применить ограничение быстро.