Урок 3. Добавление строк — INSERT
Таблица products из прошлого урока пока пуста. В этом уроке в ней появятся восемь товаров — на них построены все следующие уроки.
Одна строка
INSERT INTO products (name, category, price, qty)
VALUES ('Ручка', 'Канцелярия', 2, 150);После INSERT INTO — имя таблицы и в скобках столбцы, которые заполняются. После VALUES — значения в том же порядке: первое значение попадёт в первый названный столбец, второе — во второй. Текст — в одинарных кавычках, числа — без кавычек.
Столбец id не указан: SQLite сама поставит следующий номер. Посмотреть, что лежит в таблице, можно запросом SELECT * (звёздочка — «все столбцы», подробно о нём — в следующем уроке):
SELECT * FROM products;| id | name | category | price | qty |
|---|---|---|---|---|
| 1 | Ручка | Канцелярия | 2 | 150 |
Несколько строк сразу
Строки перечисляются после VALUES через запятую — так быстрее, чем отдельной командой на каждую:
INSERT INTO products (name, category, price, qty) VALUES
('Тетрадь', 'Канцелярия', 3, 300),
('Рюкзак', 'Сумки', 85, 12),
('Пенал', 'Канцелярия', 12, 40);Такую запись понимают SQLite, MySQL и PostgreSQL. Если хотя бы одна строка нарушает ограничение, команда не добавит ни одной: строки одной команды записываются все вместе или никакие.
Пропущенные столбцы
Столбец, которого нет в списке, получает значение по умолчанию (DEFAULT), а если его нет — NULL, то есть «ничего». У глобуса не указан остаток:
INSERT INTO products (name, category, price)
VALUES ('Глобус', 'Учёба', 45);В qty запишется 0 — так задано в DEFAULT 0. Если бы не был указан category, там оказался бы NULL: у этого столбца нет ни DEFAULT, ни NOT NULL. Что такое NULL и как его искать — в справке NULL в SQL.
Добавьте оставшиеся товары — эта таблица понадобится во всех следующих уроках:
INSERT INTO products (name, category, price, qty) VALUES
('Калькулятор', 'Техника', 30, 25),
('Наушники', 'Техника', 60, 8),
('Сумка для ноутбука', 'Сумки', 70, 5);SELECT * FROM products;| id | name | category | price | qty |
|---|---|---|---|---|
| 1 | Ручка | Канцелярия | 2 | 150 |
| 2 | Тетрадь | Канцелярия | 3 | 300 |
| 3 | Рюкзак | Сумки | 85 | 12 |
| 4 | Пенал | Канцелярия | 12 | 40 |
| 5 | Глобус | Учёба | 45 | 0 |
| 6 | Калькулятор | Техника | 30 | 25 |
| 7 | Наушники | Техника | 60 | 8 |
| 8 | Сумка для ноутбука | Сумки | 70 | 5 |
Если у вас получилось иначе (лишние строки, другие номера), проще всего начать заново: удалить таблицу (DROP TABLE products;), создать её запросом из второго урока и повторить вставки.
В DB Browser for SQLite после вставки нажмите «Write Changes», иначе строки не попадут в файл.
Без списка столбцов
Список столбцов можно не писать, но тогда значения нужно дать для всех столбцов, строго в порядке таблицы:
INSERT INTO products VALUES (NULL, 'Линейка', 'Канцелярия', 1, 80);Для id здесь передан NULL — SQLite поставит номер сама. Так писать не стоит: если в таблицу добавят столбец, запрос сломается или, хуже, запишет значения не в те столбцы. Список столбцов — надёжнее. Этот запрос не выполняйте: для курса нужны ровно восемь товаров.
Кавычки и апострофы
Текст в 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 мягко относится к типам. Создайте пробную таблицу:
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;| n | typeof(n) | s | typeof(s) |
|---|---|---|---|
| 12 | integer | 34 | text |
| abc | text | x | text |
| 5 | integer | y | text |
Функция typeof показывает, что на самом деле записано. Строка '12' превратилась в число 12, число 34 — в текст '34', а 'abc' число так и не стало, но в столбец INTEGER записалось. В таблице STRICT последний случай — ошибка:
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.nPostgreSQL проверяет типы всегда, MySQL — в строгом режиме, который включён по умолчанию. Удалите пробную таблицу: DROP TABLE test;.
Значения из программы
Когда строки добавляет программа, значения не вклеивают в текст запроса — их передают отдельно, параметрами (в SQLite и Python это знаки ?). Иначе текст вроде '); DROP TABLE products; -- из формы на сайте станет частью запроса. Такая атака называется SQL-инъекцией. Как передавать параметры, рассказано в темах Python и PHP.
Коротко
INSERT INTO таблица (столбцы) VALUES (значения);— добавить строку; несколько строк — через запятую.- Пропущенный столбец получает
DEFAULTилиNULL, номерINTEGER PRIMARY KEYставится сам. - Текст — в одинарных кавычках, апостроф внутри удваивается:
'Д''Артаньян'. - Ограничения не пропускают неверные строки — по тексту ошибки видно, какое правило нарушено.
- Из программ значения передают параметрами, а не склейкой строк.