JavaRush /Курси /SQL SELF /Вставка даних у таблиці з обмеженнями: NOT NULL

Вставка даних у таблиці з обмеженнями: NOT NULL, DEFAULT

SQL SELF
Рівень 21 , Лекція 1
Відкрита

Сьогодні ми детально розберемо ще один важливий аспект роботи з базами даних — як вставляти дані у таблиці, які мають обмеження NOT NULL і DEFAULT. На цьому етапі ти вже знайомий з базовим синтаксисом команди INSERT INTO, а також розумієш, як додавати рядки у таблиці з певною структурою. Тепер час зануритися у деталі — бо робота з обмеженнями часто стає джерелом головного болю для розробників. Але не переймайся, до кінця лекції ти будеш впевнено керувати цими механізмами!

Що таке обмеження?

Обмеження — це правила, які накладаються на стовпці таблиці. Вони допомагають зберігати дані у логічно правильному вигляді. Наприклад, неможливо залишити порожнім поле, яке обов'язково повинно містити дані (NOT NULL), або можна не вказувати значення для стовпця, якщо заздалегідь прописано значення за замовчуванням (DEFAULT).

Види обмежень: - NOT NULL — вказує, що стовпець не може містити NULL. - DEFAULT — задає значення, яке автоматично буде вставлено у стовпець, якщо його не вказати.

Обмеження допомагають підтримувати цілісність даних. Уяви, що ти зберігаєш список студентів у таблиці students, і одне з правил — у кожного студента обов'язково має бути ім'я (NOT NULL). Без цього обмеження хтось забуде вказати ім'я, і у базі даних з'явиться "безіменний студент". Або інший приклад: ти вирішив, що стандартне значення для кількості навчальних балів у нового курсу — 0 (DEFAULT), щоб не думати про це кожного разу.

Робота з обмеженням NOT NULL

Обмеження NOT NULL змушує вказувати значення у конкретному стовпці при додаванні запису. Якщо ти спробуєш вставити у цей стовпець значення NULL або взагалі не вкажеш його, база даних "образиться" (станеться помилка). Давай розглянемо приклад.

Створимо просту таблицю students:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,     -- Ім'я не може бути порожнім
    age INT
);

Зверни увагу: стовпець name має обмеження NOT NULL, а у стовпця age таких обмежень немає.

Приклад вставки даних з NOT NULL

Тепер спробуємо додати студентів:

-- Приклад успішної вставки
INSERT INTO students (name, age) VALUES ('Alice', 23);
-- Успіх: ім'я вказано, поле задовольняє обмеженню NOT NULL

-- Приклад помилки:
INSERT INTO students (age) VALUES (30);
-- Помилка: поле name не може бути NULL, бо воно має обмеження NOT NULL

Коли ти отримаєш помилку типу null value in column "name" violates not-null constraint, не лякайся — це просто PostgreSQL нагадує бути уважнішим.

Використання значень за замовчуванням (DEFAULT)

Обмеження DEFAULT каже базі даних: "Якщо раптом забудуть вказати значення для цього стовпця, використовуй ось це значення". Це полегшує життя розробникам, бо можна не заповнювати кожен рядок вручну.

Приклад таблиці з обмеженням DEFAULT

Створимо таблицю courses:

CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    credits INT DEFAULT 0   -- Значення за замовчуванням для стовпця credits — 0
);

Приклад вставки даних з DEFAULT

Тепер спробуємо додати курси:

-- Явно вказали значення для credits
INSERT INTO courses (name, credits) VALUES ('Mathematics', 5);

-- Не вказали значення для credits — буде використано значення за замовчуванням (0)
INSERT INTO courses (name) VALUES ('History');

-- Подивимось, що вийшло
SELECT * FROM courses;

Результат:

id name credits
1 Mathematics 5
2 History 0

Зверни увагу: при додаванні курсу History ми не вказали кількість кредитів. PostgreSQL автоматично заповнив стовпець credits значенням 0.

Спільне використання обмежень NOT NULL і DEFAULT

Такі стовпці вимагають значення, навіть якщо ти їх не вкажеш сам. Наприклад, у таблиці courses стовпець credits може бути і DEFAULT, і NOT NULL, щоб гарантувати, що ніхто випадково не залишить його порожнім NULL.

CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    credits INT NOT NULL DEFAULT 0
);

Приклад вставки даних

Уяви, що кожен новостворений курс має за замовчуванням мати 0 кредитів, але NULL недопустимий.

-- Успішно: кредити дорівнюють значенню за замовчуванням
INSERT INTO courses (name) VALUES ('Physics');

-- Помилка: спроба явно вставити NULL у стовпець з NOT NULL
INSERT INTO courses (name, credits) VALUES ('Chemistry', NULL);

Приклад: Додавання студента з обов'язковим ім'ям

Створимо таблицю students з обмеженнями:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,                         -- Ім'я обов'язкове
    enrollment_date DATE DEFAULT CURRENT_DATE   -- Дата зарахування за замовчуванням — поточна
);

Тепер додамо у неї студентів:

-- Ім'я вказано, дата зарахування буде заповнена автоматично
INSERT INTO students (name) VALUES ('Bob');

-- Спробуємо не вказати ім'я (отримаємо помилку)
INSERT INTO students (enrollment_date) VALUES ('2024-10-01');

Класний приклад того, як PostgreSQL допомагає гарантувати коректність даних: всі студенти обов'язково мають ім'я, а дата зарахування не потребує явного вказування.

Поради та «граблі»

Коли ти працюєш з обмеженнями NOT NULL і DEFAULT, варто пам'ятати кілька важливих речей. Наприклад, якщо у твоїх даних часто зустрічаються NULL, обмеження NOT NULL може стати справжнім головним болем. А якщо визначити значення за замовчуванням для всіх стовпців, ти можеш випадково отримати некоректні дані (наприклад, 0 замість реального значення).

Зазвичай якщо ти додаєш нову колонку у існуючу таблицю, то її комірки для вже існуючих рядків заповнюються NULL. Але якщо ти вкажеш DEFAULT X, то вся колонка заповниться значенням Х. Це дуже зручно і допомагає підтримувати цілісність бази.

Наприклад, нова колонка — це FOREING KEY на існуючу таблицю. І вона не може містити NULL або 0. А повинна посилатися на існуючі рядки існуючої таблиці.

Що робити, якщо забув додати обмеження?

Не переймайся — обмеження завжди можна додати пізніше за допомогою команди ALTER TABLE. Наприклад:

-- Додаємо обмеження DEFAULT до існуючого стовпця
ALTER TABLE courses ALTER COLUMN credits SET DEFAULT 0;

-- Додаємо обмеження NOT NULL до існуючого стовпця
ALTER TABLE students ALTER COLUMN name SET NOT NULL;

Ці запити не зламають вже існуючі дані — їх можна застосовувати до таблиць, у яких вже є щось цінне.

Тепер ти готовий використовувати потужність PostgreSQL для керування обмеженнями! Твої дані стануть більш структурованими і захищеними від помилок, а запити — логічними і передбачуваними.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ