Оператор PostgreSQL INSERT: Добавление данных в ваши таблицы
Добро пожаловать в серию наших уроков по PostgreSQL! В этом уроке мы сосредоточимся на операторе INSERT в PostgreSQL, который необходим для добавления новых данных в ваши таблицы базы данных. Понимание того, как эффективно использовать оператор INSERT, позволяет вам заполнять таблицы значимыми данными.
Введение в оператор INSERT
Оператор INSERT в PostgreSQL используется для добавления новых строк в таблицу. Вы можете вставить данные во все столбцы или только в определённые, вставить несколько строк сразу, а также импортировать данные из других таблиц.
Базовый синтаксис
INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);
INSERT INTO
: Определяет таблицу, в которую будут вставляться данные.VALUES
: Перечисляет значения, вставляемые в столбцы.
Вставка данных в таблицы PostgreSQL
Давайте исследуем различные способы использования оператора INSERT с практическими примерами на примере нашей знакомой библиотеки и базы данных с фильмами.
1. Вставка одной строки
Пример: Добавить новую книгу в таблицу books
INSERT INTO books (title, author, price, pages)
VALUES ('Brave New World', 'Aldous Huxley', 9.99, 268);
Объяснение:
- В таблицу
books
добавляется новая книга под названием 'Brave New World' с указанным автором, ценой и количеством страниц.
2. Вставка нескольких строк
Вы можете вставлять несколько строк в одном операторе, разделяя наборы значений запятыми.
Пример: Добавить нескольких авторов в таблицу authors
INSERT INTO authors (name)
VALUES ('Aldous Huxley'),
('Ray Bradbury'),
('Kurt Vonnegut');
Объяснение:
- В таблицу
authors
добавлены три новых автора.
3. Вставка данных в определённые столбцы
Если у вас нет данных для всех столбцов, вы можете вставить данные только в определённые столбцы. Неуказанные столбцы получат свои значения по умолчанию или NULL
, если значение по умолчанию не установлено.
Пример: Вставить фильм без указания дополнительных данных
Так как в нашей таблице movies
есть только столбец title
, мы можем вставить данные только в этот столбец.
INSERT INTO movies (title)
VALUES ('Blade Runner');
Объяснение:
- В таблицу
movies
добавляется новый фильм под названием 'Blade Runner'.
4. Использование значений по умолчанию
Вы можете использовать ключевое слово DEFAULT
, чтобы явно указать значение по умолчанию для столбца, если оно определено для вашей таблицы.
Пример: Вставить книгу с ценой по умолчанию
Сначала изменим таблицу books
, чтобы она имела значение по умолчанию для цены (если это ещё не сделано):
-- Изменить таблицу books, чтобы столбец price имел значение по умолчанию
ALTER TABLE books ALTER COLUMN price SET DEFAULT 9.99;
-- Вставить книгу, используя цену по умолчанию
INSERT INTO books (title, author, pages)
VALUES ('Fahrenheit 451', 'Ray Bradbury', 194);
Объяснение:
- Книга 'Fahrenheit 451' добавляется с ценой по умолчанию $9.99.
5. Вставка данных из другой таблицы
Вы можете вставлять данные в таблицу, выбирая их из другой таблицы с помощью оператора INSERT INTO ... SELECT
.
Пример: Скопировать авторов в новую таблицу
-- Создать новую таблицу для классических авторов
CREATE TABLE classic_authors (name VARCHAR(255));
-- Вставить авторов из таблицы authors в classic_authors
INSERT INTO classic_authors (name)
SELECT name
FROM authors
WHERE name IN ('George Orwell', 'Jane Austen', 'Leo Tolstoy');
Объяснение:
- Создана новая таблица
classic_authors
. - Авторы, соответствующие указанным именам, копируются в таблицу
classic_authors
.
6. Возвращение вставленных данных
Клаузула RETURNING
позволяет возвращать данные из вставленных строк.
Пример: Вставить книгу и вернуть её название и цену
INSERT INTO books (title, author, price, pages)
VALUES ('Slaughterhouse-Five', 'Kurt Vonnegut', 8.99, 275)
RETURNING title, price;
Объяснение:
- Книга вставляется, и названия и цены вставленных строк возвращаются.
7. Обработка конфликтов с помощью ON CONFLICT (Upsert)
Клаузула ON CONFLICT
позволяет вам указать альтернативное действие, если вставка нарушает уникальное ограничение.
Сначала необходимо установить уникальное ограничение на соответствующий столбец.
Пример: Вставить автора или ничего не делать, если он уже существует
Сначала убедитесь, что на столбце name
установлено уникальное ограничение:
ALTER TABLE authors ADD CONSTRAINT unique_name UNIQUE (name);
Теперь используем ON CONFLICT
:
INSERT INTO authors (name)
VALUES ('George Orwell')
ON CONFLICT (name) DO NOTHING;
Объяснение:
- Попытка вставить 'George Orwell' в таблицу
authors
. - Если автор 'George Orwell' уже существует, вставка пропускается.
8. Использование INSERT с подзапросами
Вы можете использовать подзапросы для генерации значений для вставки.
Пример: Вставить авторов из книг, которых еще нет в таблице authors
Предположим, у нас есть несколько книг, авторы которых еще не добавлены в таблицу authors
.
Сначала найдём авторов в таблице books
, которых нет в таблице authors
, и вставим их в таблицу authors
.
INSERT INTO authors (name)
SELECT DISTINCT author
FROM books
WHERE author NOT IN (SELECT name FROM authors);
Объяснение:
- Авторы из таблицы
books
, которые еще не находятся в таблицеauthors
, вставляются в таблицуauthors
. - В нашей схеме все авторы уже присутствуют, поэтому новые авторы не будут добавлены, если только не будут добавлены новые книги с новыми авторами в таблицу
books
.
9. Вставка данных JSON
Наша схема не включает таблиц с колонками типа JSON, но мы можем создать такую.
Пример: Вставить JSON-объект в таблицу
Сначала создадим таблицу с колонкой типа JSON:
CREATE TABLE book_info (
id SERIAL PRIMARY KEY,
info JSONB
);
Вставим данные JSON:
INSERT INTO book_info (info)
VALUES ('{"title": "Dune", "author": "Frank Herbert", "price": 10.99, "pages": 412}');
Объяснение:
- В таблицу
book_info
вставляется JSON-объект, содержащий информацию о книге.
10. Копирование данных между таблицами
Вы можете копировать данные из одной таблицы в другую, включая преобразования.
Пример: Копировать книги в таблицу discounted_books
с 10% скидкой
Создаём таблицу discounted_books
:
CREATE TABLE discounted_books (
title VARCHAR(255),
author VARCHAR(255),
discounted_price NUMERIC(10, 2)
);
Вставим данные с преобразованными значениями:
INSERT INTO discounted_books (title, author, discounted_price)
SELECT title, author, price * 0.9
FROM books;
Объяснение:
- Все книги копируются в таблицу
discounted_books
с применённой 10% скидкой к цене.
Заключение
Оператор INSERT в PostgreSQL — это универсальный инструмент для добавления данных в ваши таблицы. Независимо от того, вставляете ли вы одну строку, несколько строк или данные из других таблиц, освоение оператора INSERT является ключом к эффективному управлению базой данных.
Основные выводы:
- Используйте
INSERT INTO ... VALUES
для добавления новых данных. - Вставляйте несколько строк, предоставляя несколько наборов значений.
- Указывайте столбцы для вставки данных в определённые столбцы.
- Используйте
RETURNING
, чтобы получить информацию о вставленных строках. - Обрабатывайте конфликты с помощью
ON CONFLICT
, чтобы предотвратить ошибки. - Вставляйте данные из других таблиц, используя
INSERT INTO ... SELECT
. - Используйте поддержку типов данных JSON в PostgreSQL.
Schema Initialization
-- Создать таблицу books
CREATE TABLE books (
title VARCHAR(255),
author VARCHAR(255),
price NUMERIC(10, 2),
pages INTEGER
);
-- Вставить тестовые данные в таблицу books
INSERT INTO books (title, author, price, pages) VALUES
('The Great Gatsby', 'F. Scott Fitzgerald', 10.99, 180),
('To Kill a Mockingbird', 'Harper Lee', 7.99, 281),
('1984', 'George Orwell', 8.99, 328),
('Pride and Prejudice', 'Jane Austen', 6.99, 279),
('The Catcher in the Rye', 'J.D. Salinger', 9.99, 214),
('Moby-Dick', 'Herman Melville', 11.99, 635),
('War and Peace', 'Leo Tolstoy', 12.99, 1225);
-- Создать таблицу authors
CREATE TABLE authors (
name VARCHAR(255)
);
-- Вставить тестовые данные в таблицу authors
INSERT INTO authors (name) VALUES
('F. Scott Fitzgerald'),
('Harper Lee'),
('George Orwell'),
('Jane Austen'),
('J.D. Salinger'),
('Herman Melville'),
('Leo Tolstoy');
-- Создать таблицу movies
CREATE TABLE movies (
title VARCHAR(255)
);
-- Вставить тестовые данные в таблицу movies
INSERT INTO movies (title) VALUES
('The Shawshank Redemption'),
('The Godfather'),
('The Dark Knight'),
('Pulp Fiction'),
('The Lord of the Rings');
Применяйте этот шаблон для практических занятий по вставке данных, чтобы улучшить ваше понимание оператора INSERT в PostgreSQL. Удачного кодирования!