insert into sql – как добавить строки в таблицу
Оператор insert into sql добавляет строки в уже существующую таблицу. По запросу «insert перевод на русский» ответ прост: это «вставить», а INSERT INTO – «вставить в». Вы разберете вставку одной и нескольких строк, копирование через SELECT, защиту от дубликатов, транзакции и параметризованные запросы.
- insert into sql пример: синтаксис и подготовка таблицы
- Как добавить одну или несколько строк через VALUES
- INSERT INTO ... SELECT: копирование строк из другой таблицы
- Как обработать дубликаты ключа в разных СУБД
- Особенности INSERT в MySQL, Oracle и MS SQL Server
- Как выполнить вставки в транзакции
- Как передать параметры в INSERT из приложения
- Какой вариант INSERT выбрать под задачу
insert into sql пример: синтаксис и подготовка таблицы
Укажите имя таблицы, список столбцов и значения в том же порядке. Для числовых столбцов пишите числа без кавычек, а строки заключайте в одинарные кавычки.
INSERT INTO имя_таблицы (столбец1, столбец2)
VALUES (значение1, значение2);Для упражнений создайте таблицу Student в отдельной учебной базе. Так выполняется добавление данных в таблицу SQL. Выполните этот запрос в SQL-консоли своего подключения.
CREATE TABLE Student (
ROLL_NO INT PRIMARY KEY,
NAME VARCHAR(50) NOT NULL,
ADDRESS VARCHAR(100) DEFAULT 'UNKNOWN',
PHONE VARCHAR(20),
Age INT DEFAULT 18 NOT NULL
);Первичный ключ ROLL_NO запрещает повторяющиеся номера и NULL. Столбец NAME требует значение при каждой вставке. Телефон хранится строкой, поэтому сохраняет ведущие нули и знак плюса.
Добавьте четыре исходные записи отдельными запросами. Затем выберите их по номеру, чтобы проверить подготовку таблицы.
INSERT INTO Student (ROLL_NO, NAME, ADDRESS, PHONE, Age)
VALUES (1, 'Ram', 'Delhi', '9455123451', 18);
INSERT INTO Student (ROLL_NO, NAME, ADDRESS, PHONE, Age)
VALUES (2, 'RAMESH', 'GURGAON', '9562431543', 18);
INSERT INTO Student (ROLL_NO, NAME, ADDRESS, PHONE, Age)
VALUES (3, 'SUJIT', 'ROHTAK', '9156253131', 20);
INSERT INTO Student (ROLL_NO, NAME, ADDRESS, PHONE, Age)
VALUES (4, 'SURESH', 'Delhi', '9156768971', 18);
SELECT ROLL_NO, NAME, ADDRESS, PHONE, Age
FROM Student
ORDER BY ROLL_NO;| ROLL_NO | NAME | ADDRESS | PHONE | Age |
|---|---|---|---|---|
| 1 | Ram | Delhi | 9455123451 | 18 |
| 2 | RAMESH | GURGAON | 9562431543 | 18 |
| 3 | SUJIT | ROHTAK | 9156253131 | 20 |
| 4 | SURESH | Delhi | 9156768971 | 18 |
Дальше используются номера 5–11. Такой порядок не создает повторов первичного ключа.
Как добавить одну или несколько строк через VALUES
Через VALUES можно добавить строку с полным набором полей или указать только нужные столбцы; при массовой вставке группы значений объединяют в одном запросе. Выбор варианта зависит от того, насколько важно явно задать структуру записи и сколько строк нужно добавить.
insert into values: вставка через VALUES
Запрос без списка столбцов берет значения по порядку, заданному при создании таблицы. Такой вариант зависит от структуры таблицы, поэтому для рабочих запросов выбирайте явный список.
INSERT INTO Student
VALUES (5, 'HARSH', 'WEST BENGAL', '8759770477', 19);
SELECT ROLL_NO, NAME, Age
FROM Student
WHERE ROLL_NO = 5;Выборка покажет добавленную строку HARSH с номером 5. Числа 5 и 19 записаны без кавычек.
Вставка в выбранные столбцы
Явный список столбцов защищает запрос от перестановки полей при изменении таблицы. Пропущенные столбцы получают значение по правилам самой таблицы.
INSERT INTO Student (ROLL_NO, NAME, Age)
VALUES (6, 'PRATIK', 19);
SELECT ROLL_NO, NAME, ADDRESS, PHONE, Age
FROM Student
WHERE ROLL_NO = 6;| ROLL_NO | NAME | ADDRESS | PHONE | Age |
|---|---|---|---|---|
| 6 | PRATIK | UNKNOWN | NULL | 19 |
ADDRESS получает DEFAULT «UNKNOWN». PHONE допускает NULL и не имеет значения по умолчанию, поэтому там остается NULL.
Если пропустить Age, СУБД подставит 18. Если пропустить NAME, запрос завершится ошибкой: столбец отмечен как NOT NULL и не имеет DEFAULT. Автогенерируемый столбец может получить значение счетчика или последовательности. Явный NULL не запускает DEFAULT.
insert sql пример: вставка нескольких строк
Запишите несколько групп VALUES через запятую. Число и порядок значений должны совпадать со списком столбцов.
INSERT INTO Student (ROLL_NO, NAME, Age)
VALUES
(10, 'ANITA', 18),
(11, 'KIRAN', 20);
SELECT ROLL_NO, NAME, Age
FROM Student
WHERE ROLL_NO IN (10, 11)
ORDER BY ROLL_NO;Выборка покажет две новые строки. ADDRESS получит UNKNOWN, а PHONE – NULL.
Для Oracle используйте INSERT ALL, когда нужно передать несколько строк отдельными ветками одного запроса.
INSERT ALL
INTO Student (ROLL_NO, NAME, Age) VALUES (10, 'ANITA', 18)
INTO Student (ROLL_NO, NAME, Age) VALUES (11, 'KIRAN', 20)
SELECT 1 FROM dual;INSERT INTO ... SELECT: копирование строк из другой таблицы
INSERT INTO ... SELECT вставляет результаты выборки в уже существующую таблицу. Укажите столбцы назначения и соответствующие столбцы источника.
Создайте таблицу источника и добавьте в нее три записи с номерами 7–9.
CREATE TABLE LateralStudent (
ROLL_NO INT PRIMARY KEY,
NAME VARCHAR(50) NOT NULL,
ADDRESS VARCHAR(100),
PHONE VARCHAR(20),
Age INT NOT NULL
);
INSERT INTO LateralStudent (ROLL_NO, NAME, ADDRESS, PHONE, Age)
VALUES (7, 'SOUVIK', 'DUMDUM', '9876543210', 18);
INSERT INTO LateralStudent (ROLL_NO, NAME, ADDRESS, PHONE, Age)
VALUES (8, 'NIRAJ', 'NOIDA', '9786543210', 19);
INSERT INTO LateralStudent (ROLL_NO, NAME, ADDRESS, PHONE, Age)
VALUES (9, 'SOMESH', 'ROHTAK', '9687543210', 20);INSERT INTO ... SELECT
INSERT INTO Student (ROLL_NO, NAME, ADDRESS, PHONE, Age)
SELECT ROLL_NO, NAME, ADDRESS, PHONE, Age
FROM LateralStudent;
SELECT ROLL_NO, NAME, Age
FROM Student
WHERE ROLL_NO IN (7, 8, 9)
ORDER BY ROLL_NO;Запрос добавит в Student три строки с номерами 7, 8 и 9. Повторный запуск упрется в конфликт первичного ключа.
Форма INSERT INTO Student SELECT * FROM LateralStudent работает только при совпадении числа, порядка и совместимости типов столбцов. Иначе СУБД завершит запрос ошибкой или запишет значения не в те поля. Явный список столбцов снижает такой риск.
Вставка с условием WHERE
Добавьте WHERE, чтобы передать в целевую таблицу только подходящие строки. Создайте отдельную таблицу Student18, чтобы не повторять ключи Student.
CREATE TABLE Student18 (
ROLL_NO INT PRIMARY KEY,
NAME VARCHAR(50) NOT NULL,
Age INT NOT NULL
);
INSERT INTO Student18 (ROLL_NO, NAME, Age)
SELECT ROLL_NO, NAME, Age
FROM LateralStudent
WHERE Age = 18;
SELECT ROLL_NO, NAME, Age
FROM Student18;Student18 получит одну строку: SOUVIK с номером 7 и возрастом 18.
SELECT INTO и INSERT INTO SELECT
Запрос select into sql решает другую задачу. SELECT INTO создает новую таблицу из результата выборки в MS SQL Server и PostgreSQL. INSERT INTO SELECT добавляет строки в уже существующую таблицу.
SELECT ROLL_NO, NAME, Age
INTO StudentSnapshot
FROM Student;В MySQL конструкция SELECT ... INTO записывает результат в переменные или файл. Для создания таблицы из выборки MySQL использует CREATE TABLE ... SELECT.
Как обработать дубликаты ключа в разных СУБД
Обычный INSERT завершится ошибкой, если значение PRIMARY KEY или UNIQUE уже есть. Предварительная проверка через SELECT не заменяет ограничение: параллельный запрос может вставить ту же строку раньше.
insert into mysql – INSERT IGNORE
INSERT IGNORE пропускает строку с повторяющимся уникальным ключом.
INSERT IGNORE INTO Student (ROLL_NO, NAME, Age)
VALUES (5, 'HARSH', 19);
SHOW WARNINGS;Строка с номером 5 останется без изменений. Не используйте IGNORE для любых ошибок: модификатор может превратить некоторые проблемы данных в предупреждения.
MySQL – ON DUPLICATE KEY UPDATE
INSERT INTO Student (ROLL_NO, NAME, Age)
VALUES (5, 'HARSH', 20)
ON DUPLICATE KEY UPDATE
NAME = 'HARSH',
Age = 20;При конфликте MySQL обновит имя и возраст, а ADDRESS и PHONE сохранит.
PostgreSQL – ON CONFLICT
INSERT INTO Student (ROLL_NO, NAME, Age)
VALUES (5, 'HARSH', 19)
ON CONFLICT (ROLL_NO) DO NOTHING;DO NOTHING пропустит повторную строку. Для обновления используйте EXCLUDED.
INSERT INTO Student (ROLL_NO, NAME, Age)
VALUES (5, 'HARSH', 20)
ON CONFLICT (ROLL_NO) DO UPDATE
SET NAME = EXCLUDED.NAME,
Age = EXCLUDED.Age;Oracle – MERGE
MERGE сравнивает источник с целевой таблицей по условию ON. Совпавшую строку оператор обновляет, отсутствующую добавляет.
MERGE INTO Student t
USING (
SELECT 5 AS ROLL_NO, 'HARSH' AS NAME, 20 AS Age
FROM dual
) s
ON (t.ROLL_NO = s.ROLL_NO)
WHEN MATCHED THEN
UPDATE SET t.NAME = s.NAME, t.Age = s.Age
WHEN NOT MATCHED THEN
INSERT (ROLL_NO, NAME, Age)
VALUES (s.ROLL_NO, s.NAME, s.Age);MS SQL Server – MERGE
MERGE INTO Student WITH (HOLDLOCK) AS t
USING (VALUES (5, 'HARSH', 20)) AS s (ROLL_NO, NAME, Age)
ON t.ROLL_NO = s.ROLL_NO
WHEN MATCHED THEN
UPDATE SET NAME = s.NAME, Age = s.Age
WHEN NOT MATCHED THEN
INSERT (ROLL_NO, NAME, Age)
VALUES (s.ROLL_NO, s.NAME, s.Age);После MERGE выберите строку 5 и убедитесь, что возраст стал 20. В MS SQL Server завершайте MERGE точкой с запятой.
Особенности INSERT в MySQL, Oracle и MS SQL Server
Получить идентификатор добавленной строки можно средствами конкретной СУБД, используя предусмотренный ею синтаксис возврата значения. Выберите подходящий вариант с учетом используемой базы и способа генерации идентификатора.
Получение нового идентификатора в MySQL
CREATE TABLE Registration (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
INSERT INTO Registration (name) VALUES ('HARSH');
SELECT LAST_INSERT_ID() AS new_id;LAST_INSERT_ID() возвращает созданный идентификатор в том же соединении с базой.
Получение идентификатора в PostgreSQL
CREATE TABLE Registration (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
INSERT INTO Registration (name)
VALUES ('HARSH')
RETURNING id, name;RETURNING возвращает поля добавленной строки сразу после INSERT.
insert into oracle – INSERT ALL и RETURNING INTO
INSERT ALL передает несколько строк в одной команде через отдельные ветки INTO.
INSERT ALL
INTO Student (ROLL_NO, NAME, Age) VALUES (10, 'ANITA', 18)
INTO Student (ROLL_NO, NAME, Age) VALUES (11, 'KIRAN', 20)
SELECT 1 FROM dual;Для получения идентификатора в PL/SQL используйте RETURNING INTO.
DECLARE
v_id NUMBER;
BEGIN
INSERT INTO Registration (id, name)
VALUES (registration_seq.NEXTVAL, 'HARSH')
RETURNING id INTO v_id;
DBMS_OUTPUT.PUT_LINE(v_id);
END;MS SQL Server – OUTPUT и IDENTITY_INSERT
CREATE TABLE Registration (
id INT IDENTITY(1, 1) PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
INSERT INTO Registration (name)
OUTPUT inserted.id, inserted.name
VALUES ('HARSH');OUTPUT возвращает поля добавленной строки. Конструкция inserted обозначает значения новой записи.
Для переноса конкретного идентификатора временно включите IDENTITY_INSERT в текущем соединении.
SET IDENTITY_INSERT Registration ON;
INSERT INTO Registration (id, name)
VALUES (100, 'IMPORTED');
SET IDENTITY_INSERT Registration OFF;После вставки выключите IDENTITY_INSERT. MS SQL Server ограничивает список INSERT ... VALUES 1000 строками. Большой набор разделите на пакеты или передайте через INSERT ... SELECT.
Как выполнить вставки в транзакции
Транзакция объединяет несколько запросов в одну операцию. COMMIT сохраняет изменения, а ROLLBACK отменяет неподтвержденные изменения. После COMMIT откатить эту транзакцию нельзя.
Выполните пакет в одном соединении PostgreSQL. До COMMIT выборка увидит обе новые строки.
BEGIN;
INSERT INTO Student (ROLL_NO, NAME, Age)
VALUES (20, 'MEERA', 18);
INSERT INTO Student (ROLL_NO, NAME, Age)
VALUES (21, 'ARUN', 19);
SELECT ROLL_NO, NAME, Age
FROM Student
WHERE ROLL_NO IN (20, 21);
COMMIT;Если выборка показывает неверные данные, выполните ROLLBACK вместо COMMIT. Для проверки отката используйте отдельную транзакцию.
BEGIN;
INSERT INTO Student (ROLL_NO, NAME, Age)
VALUES (22, 'TEST', 18);
ROLLBACK;
SELECT ROLL_NO, NAME, Age
FROM Student
WHERE ROLL_NO = 22;После ROLLBACK выборка не вернет строку 22. Ошибка в PostgreSQL переводит транзакцию в аварийное состояние, поэтому сначала выполните откат, затем повторите исправленный пакет.
| СУБД | Начало транзакции | Завершение |
|---|---|---|
| PostgreSQL | BEGIN | COMMIT или ROLLBACK |
| MySQL | START TRANSACTION | COMMIT или ROLLBACK |
| MS SQL Server | BEGIN TRANSACTION | COMMIT или ROLLBACK |
| Oracle | Первое изменение данных при выключенном автоподтверждении | COMMIT или ROLLBACK |
Как передать параметры в INSERT из приложения
Подготовленный запрос отделяет SQL-команду от пользовательских значений. Не собирайте INSERT конкатенацией строк: апостроф в имени может сломать запрос, а вредоносное значение способно изменить его смысл.
Пример на Python использует встроенный модуль sqlite3 и базу в памяти.
import sqlite3
connection = sqlite3.connect(":memory:")
connection.execute("""
CREATE TABLE Student (
ROLL_NO INTEGER PRIMARY KEY,
NAME TEXT NOT NULL,
Age INTEGER NOT NULL
)
""")
connection.commit()
sql = "INSERT INTO Student (ROLL_NO, NAME, Age) VALUES (?, ?, ?)"
try:
connection.execute("BEGIN")
connection.execute(sql, (1, "O'Neil", 19))
connection.execute(sql, (2, "HARSH", 20))
connection.commit()
except Exception:
connection.rollback()
raise
rows = connection.execute(
"SELECT ROLL_NO, NAME, Age FROM Student ORDER BY ROLL_NO"
).fetchall()
print(rows)
connection.close()Программа добавит две записи, включая имя O'Neil с апострофом. Если вторая вставка завершится ошибкой, обработчик отменит первую.
Знаки вопроса подходят для sqlite3. Другие драйверы могут использовать именованные параметры или собственные маркеры. Параметры заменяют значения, но не имена таблиц и столбцов, поэтому такие имена выбирайте из разрешенного списка приложения.
Какой вариант INSERT выбрать под задачу
| Задача | Решение |
|---|---|
| Добавить одну строку | INSERT INTO t (столбцы) VALUES (значения) |
| Добавить несколько строк | Несколько групп VALUES или INSERT ALL в Oracle |
| Скопировать строки | INSERT INTO t (столбцы) SELECT ... |
| Скопировать подходящие строки | INSERT INTO ... SELECT ... WHERE ... |
| Пропустить дубликат | INSERT IGNORE в MySQL или ON CONFLICT DO NOTHING в PostgreSQL |
| Обновить строку при конфликте | ON DUPLICATE KEY UPDATE, ON CONFLICT DO UPDATE или MERGE |
| Получить идентификатор | LAST_INSERT_ID(), RETURNING, RETURNING INTO или OUTPUT |
| Отменить пакет при ошибке | Транзакция с COMMIT или ROLLBACK |
Совет от нашей редакции: перед INSERT INTO SELECT выполните один SELECT и проверьте строки, столбцы и условие WHERE. Так вы заметите ошибку выборки до изменения целевой таблицы.
Популярное за неделю
- Как создать сайт самому в 2026: 4 способа + пошаговая инструкция 34 мин чтения
- Лучшие конструкторы для создания сайтов — плюсы, минусы и сравнения 22 мин чтения
- 7 бесплатных СУБД для управления базами данных 5 мин чтения
- Команды MySQL в консоли: от входа до бэкапа 15 мин чтения
- Модели баз данных: иерархическая, сетевая и реляционная 9 мин чтения
- Работа с датой и временем в MySQL 5 мин чтения
Комментарии