← К оглавлению занятия

Занятие 13. Создание и изменение таблиц. Ограничения

📁 Блок: SQL / MySQL / DDL ⏱️ Время изучения: ~90 мин 🎯 Сложность: Средняя
#create #drop #truncate #select #auto_increment #unique #null #default #check #insert #update #delete #set #where

⚡ Кратко: суть темы

Занятие учит создавать таблицы и управлять целостностью данных через ограничения. Разбираем CREATE TABLE, INSERT, UPDATE, CREATE TABLE ... AS SELECT, а также ограничения PRIMARY KEY, UNIQUE, NOT NULL, DEFAULT, CHECK и AUTO_INCREMENT.

  • CREATE TABLE определяет структуру таблицы: столбцы, типы данных, ограничения.
  • Ограничения защищают данные от некорректных значений.
  • INSERT добавляет строки, UPDATE изменяет существующие.

Что запомнить: ограничения — это правила качества данных, которые работают на уровне базы.

Частая ошибка: забыть WHERE в UPDATE и изменить все строки таблицы.

📖 Создание таблиц с нуля

Оператор CREATE TABLE создаёт новую таблицу. Для каждого столбца указываются имя, тип данных и ограничения.

CREATE TABLE TableName (
    Column1 DataType Constraints,
    Column2 DataType Constraints,
    Column3 DataType Constraints,
    ...
);

📖 Ограничения (constraints)

Ограничения обеспечивают целостность и точность данных. Рассмотрим основные.

ОграничениеНазначениеПример
PRIMARY KEY Уникально идентифицирует каждую строку; не может быть NULL EmployeeID INT PRIMARY KEY
AUTO_INCREMENT Автоматически увеличивает значение столбца на 1 EmployeeID INT AUTO_INCREMENT PRIMARY KEY
UNIQUE Значения в столбце должны быть уникальными Email VARCHAR(100) UNIQUE
NOT NULL Столбец не может содержать NULL FirstName VARCHAR(50) NOT NULL
DEFAULT Значение по умолчанию, если не указано другое HireDate DATE DEFAULT CURRENT_DATE
CHECK Проверяет условие для значения столбца Salary DECIMAL(10, 2) CHECK (Salary > 0)

Пример: таблица сотрудников

CREATE TABLE Employees (
    EmployeeID INT AUTO_INCREMENT PRIMARY KEY,
    FirstName VARCHAR(50) NOT NULL,
    LastName VARCHAR(50) NOT NULL,
    BirthDate DATE,
    HireDate DATE DEFAULT CURRENT_DATE,
    Salary DECIMAL(10, 2) CHECK (Salary > 0),
    Email VARCHAR(100) UNIQUE
);

📖 Вставка данных: INSERT INTO

Оператор INSERT INTO добавляет новые строки в таблицу.

INSERT INTO Employees (FirstName, LastName, BirthDate, Salary, Email)
VALUES ('Alice', 'Green', '1985-05-15', 55000.00, 'alice.green@example.com'),
       ('Bob', 'Smith', '1990-08-22', 60000.00, 'bob.smith@example.com'),
       ('Charlie', 'Johnson', '1988-02-10', 52000.00, 'charlie.johnson@example.com');

Если попытаться вставить данные, нарушающие ограничения, СУБД вернёт ошибку. Например, дублирующий Email или отрицательная Salary.

📖 Копирование таблицы: CREATE TABLE ... AS SELECT

Можно создать новую таблицу на основе выборки из существующей.

CREATE TABLE Employees_short AS
SELECT * FROM Employees
LIMIT 2;

Проверить по документации: синтаксис копирования таблицы отличается между СУБД. В MySQL используется CREATE TABLE ... AS SELECT, в PostgreSQL — тот же подход, но поведение с индексами и ограничениями может отличаться.

📖 Изменение данных: UPDATE

Оператор UPDATE изменяет существующие записи. Важно всегда указывать WHERE, иначе изменения применятся ко всем строкам.

-- Изменить зарплату одного сотрудника
UPDATE Employees
SET Salary = 65000
WHERE EmployeeID = 1;

-- Увеличить зарплату на 10% для сотрудников, нанятых с 2024 года
UPDATE Employees
SET Salary = Salary * 1.10
WHERE HireDate >= '2024-01-01';

📖 Источники и методы внесения данных

Данные в базу обычно попадают не через ручной ввод, а автоматически:

  • Импорт из файлов: CSV, Excel, XML, JSON.
  • Пользовательские интерфейсы: веб-формы, мобильные приложения.
  • API: обмен данными между системами.
  • Другие базы данных: ETL-процессы, миграции, синхронизация.

Почему не вручную:

  • Эффективность и масштабируемость: большие объёмы данных невозможно ввести вручную.
  • Точность: автоматизация снижает риск человеческих ошибок.
  • Интеграция: системы обмениваются данными без участия человека.
  • Актуальность: автоматическое обновление поддерживает данные в актуальном состоянии.

✨ Современные практики

  • Продумывайте структуру таблицы до её создания: типы данных и ограничения сложно менять на боевых системах.
  • Используйте PRIMARY KEY с AUTO_INCREMENT для суррогатных ключей.
  • Применяйте CHECK для бизнес-правил, но проверяйте поддержку в вашей СУБД (в MySQL CHECK полноценно работает с версии 8.0.16).
  • Всегда указывайте WHERE в UPDATE и DELETE.
  • Тестируйте DDL-скрипты в отдельной схеме перед применением на продакшене.