SQLLab
Теория· 5 мин· 10 XP

Синтаксис INSERT INTO

Команда INSERT INTO добавляет одну или несколько новых строк в таблицу.

Базовый синтаксис

sql
INSERT INTO table_name (col1, col2, col3)
VALUES (val1, val2, val3);

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

sql
INSERT INTO users VALUES (DEFAULT, 'mail@x.com', 'user1', 'User One', 'user', 'active', 0, NOW());

Но явное перечисление столбцов — хорошая практика: защищает от изменений схемы.

RETURNING — получить вставленную строку

Без RETURNING INSERT ничего не возвращает. Добавьте RETURNING, чтобы сразу увидеть вставленные значения — особенно полезно для получения auto-generated id:

sql
INSERT INTO users (email, username, full_name)
VALUES ('new@example.com', 'newuser', 'New User')
RETURNING id, email, username;

DEFAULT значения

У некоторых столбцов при создании таблицы задано значение по умолчанию (DEFAULT). В users это:

sql
role        VARCHAR(20) DEFAULT 'user',
status      VARCHAR(20) DEFAULT 'active',
login_count INTEGER     DEFAULT 0,
created_at  TIMESTAMP   DEFAULT '2024-01-01'

Есть два способа воспользоваться значением по умолчанию.

1. Не указывать столбец вообще — PostgreSQL подставит DEFAULT сам:

sql
INSERT INTO users (email, username)
VALUES ('test@x.com', 'tester')
RETURNING id, role, status, login_count;
-- role='user', status='active', login_count=0

2. Написать ключевое слово DEFAULT вместо значения — так же, как в примере выше для id:

sql
INSERT INTO users (email, username, role, status)
VALUES ('test2@x.com', 'tester2', DEFAULT, 'blocked')
RETURNING id, role, status;
-- role='user' (взято из DEFAULT), status='blocked' (задано явно)

Второй способ удобен, когда столбец нужно оставить в списке (например, при вставке без перечисления столбцов), но значение выбрать по умолчанию.

Вставка нескольких строк

sql
INSERT INTO products (name, category, price)
VALUES
  ('USB Hub',  'electronics', 990.00),
  ('Webcam HD','electronics', 3490.00)
RETURNING id, name, price;

Прочитайте урок до конца — прогресс засчитается автоматически