insert into sql – как добавить строки в таблицу

Оператор insert into sql добавляет строки в уже существующую таблицу. По запросу «insert перевод на русский» ответ прост: это «вставить», а INSERT INTO – «вставить в». Вы разберете вставку одной и нескольких строк, копирование через SELECT, защиту от дубликатов, транзакции и параметризованные запросы.

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_NONAMEADDRESSPHONEAge
1RamDelhi945512345118
2RAMESHGURGAON956243154318
3SUJITROHTAK915625313120
4SURESHDelhi915676897118

Дальше используются номера 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_NONAMEADDRESSPHONEAge
6PRATIKUNKNOWNNULL19

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 переводит транзакцию в аварийное состояние, поэтому сначала выполните откат, затем повторите исправленный пакет.

СУБДНачало транзакцииЗавершение
PostgreSQLBEGINCOMMIT или ROLLBACK
MySQLSTART TRANSACTIONCOMMIT или ROLLBACK
MS SQL ServerBEGIN TRANSACTIONCOMMIT или 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. Так вы заметите ошибку выборки до изменения целевой таблицы.

Комментарии

Оставьте свой комментарий
Пока никто не оставил комментариев