Занятие 13. Создание и изменение таблиц. Ограничения
⚡ Кратко: суть темы
Занятие учит создавать таблицы и управлять целостностью данных через ограничения. Разбираем 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для бизнес-правил, но проверяйте поддержку в вашей СУБД (в MySQLCHECKполноценно работает с версии 8.0.16). - Всегда указывайте
WHEREвUPDATEиDELETE. - Тестируйте DDL-скрипты в отдельной схеме перед применением на продакшене.