JavaRush /Курсы /SQL SELF /Типичные ошибки при создании и изменении таблиц

Типичные ошибки при создании и изменении таблиц

SQL SELF
18 уровень , 4 лекция
Открыта

Привет, будущие гуру PostgreSQL! Сегодняшняя тема посвящена, пожалуй, одному из самых ценных навыков в программировании — избеганию ошибок. Всех их, конечно, избежать не получится, особенно если вы только начинаете изучать SQL. Но быстро разобраться с типичными ошибками — вполне реально. Это как прогуляться в темноте по комнате с множеством углов: пару раз ударились, но зато потом знаете, где что стоит. А я помогу обойти "острые углы" при создании и изменении таблиц.

Ошибка 1: Неправильный выбор типа данных

Работа с типами данных — как подбор ключа к замку. Неправильный "ключ" в виде типа данных может привести к тому, что таблица будет работать некорректно или станет менее эффективной.

Пример ошибки:

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

  • Начинаются с нуля (0123456789 станет просто 123456789).
  • Содержат символы, такие как "+" или пробелы.
-- Неправильно:
CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    phone_number INTEGER -- Ой-ой
);

-- Правильно:
CREATE TABLE customers (
    id SERIAL PRIMARY KEY,
    phone_number VARCHAR(15) -- Подходит для хранения всех форматов номеров
);

Как избежать?
Внимательно анализируйте природу данных, которые вы будете хранить, перед выбором типа данных. Если сомневаетесь, загляните в официальную документацию PostgreSQL о типах данных.

Ошибка 2: Игнорирование ограничений NOT NULL, CHECK, UNIQUE

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

Пример ошибки: Вы создаете таблицу для хранения студентов, и забываете о том, что имя и возраст студента обязательны.

-- Неправильно:
CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    age INTEGER
);

INSERT INTO students (name, age) VALUES (NULL, NULL); -- Ой, что это?!

Правильный вариант:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL, -- Имя обязательно
    age INTEGER CHECK (age > 0) -- Возраст должен быть положительным
);

Как избежать?
Всегда задавайте ограничения для обязательных полей. Это своего рода "защитный механизм", который предотвращает попадание проблемных данных.

Ошибка 3: Проблемы с уникальностью

Иногда вы можете забыть добавить ограничение уникальности UNIQUE на колонку, которая должна содержать уникальные значения. Это приводит к дублирующимся данным.

Пример ошибки: Вы создаете таблицу для хранения адресов электронной почты, но забываете добавить UNIQUE.

-- Неправильно:
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(100)
);

INSERT INTO users (email) VALUES ('user@example.com');
INSERT INTO users (email) VALUES ('user@example.com'); -- Уже есть такой email!

Правильный вариант:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(100) UNIQUE -- Уникальные email
);

Как избежать?
Всегда добавляйте UNIQUE, если значения должны быть уникальными. Если хотите гибкости, можно использовать CONSTRAINT с именем, чтобы идентифицировать ограничение:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(100),
    CONSTRAINT unique_email UNIQUE (email)
);

Ошибка 4: Ошибка при изменении таблиц (ALTER TABLE)

Использование ALTER TABLE может быть коварным, особенно если данные уже находятся в таблице. Например, вы можете забыть о допустимых значениях в колонке, что приведет к ошибкам при работе с существующими данными.

Пример ошибки: Вы хотите добавить ограничение NOT NULL на уже существующую колонку, но в столбце есть значения NULL.

-- Неправильно:
ALTER TABLE students ALTER COLUMN name SET NOT NULL; -- Ошибка!

Если в таблице уже есть строки с NULL, PostgreSQL не позволит вам добавить ограничение.

Как быть?

Перед добавлением ограничений убедитесь, что данные соответствуют требованиям. Например:

UPDATE students SET name = 'Unknown' WHERE name IS NULL;
ALTER TABLE students ALTER COLUMN name SET NOT NULL;

Ошибка 5: Удаление таблиц или данных без проверки

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

Пример ошибки:

DROP TABLE courses; -- Ой, это была не та таблица!

Как избежать?

Используйте команду \dt в psql, чтобы посмотреть, какие таблицы существуют, и убедитесь, что удаляете нужную.

Либо используйте DROP TABLE IF EXISTS, чтобы избежать ошибок при попытке удалить несуществующую таблицу:

DROP TABLE IF EXISTS courses;

Ошибка 6: Проблемы с временными таблицами

Временные таблицы исчезают в конце сессии. Если вы по ошибке попытаетесь использовать временную таблицу, а сессия уже завершилась, получите ошибку.

Пример ошибки:

CREATE TEMP TABLE temp_students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100)
);

-- Завершили сессию, а теперь...
SELECT * FROM temp_students; -- Ошибка: таблицы больше нет!

Как избежать?

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

Ошибка 7: Забыли про ограничения при тестировании

Часто при разработке вы можете пропустить некоторые ограничения, полагая, что "ну, потом добавим". Но, как показывает практика, "потом" может забыться.

Пример ошибки:

CREATE TABLE test_table (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50)
);

-- Вставляем данные:
INSERT INTO test_table (name) VALUES ('Duplicate Name');
INSERT INTO test_table (name) VALUES ('Duplicate Name'); -- Проблемы начинаются...

Как избежать?

Сразу создавайте таблицы с ограничениями, даже на этапе тестирования:

CREATE TABLE test_table (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) UNIQUE -- Избавит от головной боли
);
2
Задача
SQL SELF, 18 уровень, 4 лекция
Недоступна
Создание таблицы с правильным типом данных
Создание таблицы с правильным типом данных
2
Задача
SQL SELF, 18 уровень, 4 лекция
Недоступна
Добавление ограничений к существующей таблице
Добавление ограничений к существующей таблице
1
Опрос
Изменение структуры таблиц, 18 уровень, 4 лекция
Недоступен
Изменение структуры таблиц
Изменение структуры таблиц
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анатолий Уровень 50
3 февраля 2026
❤️
Slevin Уровень 57
11 сентября 2025
1. Ценнейшая лекция... "Ошибка - вы забыли написать UNIQUE" "Неправильный пример - код без UNIQUE" "Правильный пример - код с UNIQUE" 2. Пример решения второй задачи не соответствует условию задачи. --- YouTube (осторожно, если вы слишком сахарные...)
Ra Уровень 35 Student
30 июля 2025
9-й вопрос разве не 2 варианта ? (если таблица создаётся внутри транзакции)
Евгений Уровень 49 Expert
5 августа 2025
Да, так и есть. Правда, в интернете везде пишут в основном только о сеансе. Видимо, временные таблицы чаще используются в рамках сеансов, нежели в рамках транзакций, хотя они могут быть созданы и так, и так, и в обоих случаях будут удалены автоматически (по завершении сеанса или по завершении транзакции). https://postgrespro.ru/docs/postgrespro/9.6/sql-createtable
Ra Уровень 35 Student
30 июля 2025
По моему в теории надо улучшить тему add constraints. Учесть все варианты.