Глиф Учебники

Урок 3. Добавление строк — INSERT

Курс «SQL» · урок 3 из 10 · 4 минуты чтения

Таблица products из прошлого урока пока пуста. В этом уроке в ней появятся восемь товаров — на них построены все следующие уроки.

Одна строка

SQL
INSERT INTO products (name, category, price, qty)
VALUES ('Ручка', 'Канцелярия', 2, 150);

После INSERT INTO — имя таблицы и в скобках столбцы, которые заполняются. После VALUES — значения в том же порядке: первое значение попадёт в первый названный столбец, второе — во второй. Текст — в одинарных кавычках, числа — без кавычек.

INSERT INTO products VALUES name category price qty 1 2 3 4 'Ручка' 'Канцелярия' 2 150 id name category price qty 1 Ручка Канцелярия 2 150 id не указан — номер ставит SQLite
Значения после VALUES попадают в столбцы по порядку: первое — в первый названный столбец, второе — во второй, а номер id, которого нет в списке, SQLite ставит сама.

Столбец id не указан: SQLite сама поставит следующий номер. Посмотреть, что лежит в таблице, можно запросом SELECT * (звёздочка — «все столбцы», подробно о нём — в следующем уроке):

SQL
SELECT * FROM products;
idnamecategorypriceqty
1РучкаКанцелярия2150

Несколько строк сразу

Строки перечисляются после VALUES через запятую — так быстрее, чем отдельной командой на каждую:

SQL
INSERT INTO products (name, category, price, qty) VALUES
    ('Тетрадь', 'Канцелярия', 3, 300),
    ('Рюкзак', 'Сумки', 85, 12),
    ('Пенал', 'Канцелярия', 12, 40);

Такую запись понимают SQLite, MySQL и PostgreSQL. Если хотя бы одна строка нарушает ограничение, команда не добавит ни одной: строки одной команды записываются все вместе или никакие.

все строки верны одна команда INSERT name price Тетрадь 3 Рюкзак 85 Пенал 12 в таблице +3 строки вторая нарушает CHECK одна команда INSERT name price Тетрадь 3 Рюкзак −5 Пенал 12 в таблице ни одной новой
Строки одной команды INSERT записываются все вместе или никакие: если вторая строка нарушает CHECK ценой −5, в таблицу не попадут и верные первая и третья.

Пропущенные столбцы

Столбец, которого нет в списке, получает значение по умолчанию (DEFAULT), а если его нет — NULL, то есть «ничего». У глобуса не указан остаток:

SQL
INSERT INTO products (name, category, price)
VALUES ('Глобус', 'Учёба', 45);

В qty запишется 0 — так задано в DEFAULT 0. Если бы не был указан category, там оказался бы NULL: у этого столбца нет ни DEFAULT, ни NOT NULL. Что такое NULL и как его искать — в справке NULL в SQL.

столбец не указан есть DEFAULT? да нет есть NOT NULL? нет да значение по умолчанию qty получит 0 — задано DEFAULT 0 NULL — «ничего» category получила бы NULL ошибка — строка не записана NOT NULL constraint failed: products.name
Пропущенный столбец получает значение DEFAULT, если оно задано, иначе NULL, а если столбец объявлен NOT NULL и DEFAULT у него нет, строка не записывается.

Добавьте оставшиеся товары — эта таблица понадобится во всех следующих уроках:

SQL
INSERT INTO products (name, category, price, qty) VALUES
    ('Калькулятор', 'Техника', 30, 25),
    ('Наушники', 'Техника', 60, 8),
    ('Сумка для ноутбука', 'Сумки', 70, 5);
SQL
SELECT * FROM products;
idnamecategorypriceqty
1РучкаКанцелярия2150
2ТетрадьКанцелярия3300
3РюкзакСумки8512
4ПеналКанцелярия1240
5ГлобусУчёба450
6КалькуляторТехника3025
7НаушникиТехника608
8Сумка для ноутбукаСумки705

Если у вас получилось иначе (лишние строки, другие номера), проще всего начать заново: удалить таблицу (DROP TABLE products;), создать её запросом из второго урока и повторить вставки.

В DB Browser for SQLite после вставки нажмите «Write Changes», иначе строки не попадут в файл.

Без списка столбцов

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

SQL
INSERT INTO products VALUES (NULL, 'Линейка', 'Канцелярия', 1, 80);

Для id здесь передан NULL — SQLite поставит номер сама. Так писать не стоит: если в таблицу добавят столбец, запрос сломается или, хуже, запишет значения не в те столбцы. Список столбцов — надёжнее. Этот запрос не выполняйте: для курса нужны ровно восемь товаров.

Кавычки и апострофы

Текст в SQL — в одинарных кавычках. Если внутри текста есть апостроф, его удваивают:

SQL
SELECT 'Д''Артаньян' AS name;
name
Д'Артаньян

Двойные кавычки для текста не годятся. Некоторые СУБД такой текст принимают, но PostgreSQL считает "Кружка" именем столбца и выдаёт ошибку column "Кружка" does not exist. Пишите одинарные — так работает везде.

Частые ошибки

Сообщение SQLiteПричина
NOT NULL constraint failed: products.nameНе указано значение обязательного столбца
CHECK constraint failed: price >= 0Значение не прошло проверку CHECK
UNIQUE constraint failed: products.idТакой id (или другое уникальное значение) уже есть
2 values for 3 columnsЗначений меньше или больше, чем столбцов в списке
no such table: productsТаблицы нет: опечатка в имени или открыта не та база

Последняя ошибка часто значит, что sqlite3 запущена без имени файла или в другой папке: тогда открыта новая пустая база. Проверьте командой .tables.

Типы при вставке

Обычная таблица SQLite мягко относится к типам. Создайте пробную таблицу:

SQL
CREATE TABLE test (n INTEGER, s TEXT);
INSERT INTO test VALUES ('12', 34), ('abc', 'x'), (5.0, 'y');
SELECT n, typeof(n), s, typeof(s) FROM test;
ntypeof(n)stypeof(s)
12integer34text
abctextxtext
5integerytext

Функция typeof показывает, что на самом деле записано. Строка '12' превратилась в число 12, число 34 — в текст '34', а 'abc' число так и не стало, но в столбец INTEGER записалось. В таблице STRICT последний случай — ошибка:

SQL
DROP TABLE test;
CREATE TABLE test (n INTEGER, s TEXT) STRICT;
INSERT INTO test VALUES ('abc', 'x');
Текст
cannot store TEXT value in INTEGER column test.n

PostgreSQL проверяет типы всегда, MySQL — в строгом режиме, который включён по умолчанию. Удалите пробную таблицу: DROP TABLE test;.

Значения из программы

Когда строки добавляет программа, значения не вклеивают в текст запроса — их передают отдельно, параметрами (в SQLite и Python это знаки ?). Иначе текст вроде '); DROP TABLE products; -- из формы на сайте станет частью запроса. Такая атака называется SQL-инъекцией. Как передавать параметры, рассказано в темах Python и PHP.

Коротко

Проверьте себя

1. Что окажется в столбце qty после INSERT INTO products (name, category, price) VALUES ('Глобус', 'Учёба', 45);?
2. Как записать в SQL текст О'Нил?
3. Команда добавляет три строки, а вторая нарушает CHECK. Сколько строк окажется в таблице?
4. Почему значения из формы сайта нельзя вклеивать прямо в текст запроса?