Первичные ключи
В первом уроке вы познакомились с первичным ключом: это столбец, который идентифицирует каждую строку, например id в таблице games. Первичный ключ подчиняется двум правилам: у двух строк не может быть в нём одинаковое значение, и он никогда не бывает NULL. Поэтому WHERE id = 5 всегда находит не больше одной строки, а другие таблицы могут ссылаться на строку по её ключу.
Чтобы сделать столбец первичным ключом, напишите PRIMARY KEY после его типа. Например, таблица жанров:
CREATE TABLE genres (
id INTEGER PRIMARY KEY,
name TEXT
) STRICT;В SQLite INTEGER PRIMARY KEY делает ещё кое-что: если INSERT пропускает этот столбец, SQLite сам выбирает число. Он берёт на единицу больше наибольшего числа в таблице или 1, если таблица пуста. Так получались автоматические идентификаторы в прошлом уроке:
INSERT INTO genres (name)
VALUES ('RPG'), ('Racing'), ('Puzzle');
SELECT * FROM genres;| id | name |
|---|---|
| 1 | RPG |
| 2 | Racing |
| 3 | Puzzle |
Идентификатор можно задать и самому, но занятое число отклоняется. В сообщении об ошибке написано UNIQUE, потому что первичный ключ уникален; о UNIQUE вы узнаете подробнее чуть позже:
INSERT INTO genres (id, name)
VALUES (2, 'Sports');Error on line 1: UNIQUE constraint failed: genres.idКакой столбец сделать первичным ключом? Обычно это столбец id с числом и ничем больше. Имя или адрес электронной почты тоже могут казаться уникальными, но люди меняют почту, а у двух клиентов может быть одинаковое имя. Число, которое никогда не меняется, — самое надёжное, на что могут ссылаться другие таблицы.
Другие базы данных создают автоматические идентификаторы по-своему, например id SERIAL в PostgreSQL или id INT AUTO_INCREMENT в MySQL. В SQLite вам может встретиться и INTEGER PRIMARY KEY AUTOINCREMENT: он гарантирует, что номер удалённой строки никогда не будет использован снова, что нужно редко. А первичный ключ может состоять и из нескольких столбцов, как у order_items. Такой вы создадите позже в этом уроке.
Типичная ошибка: INT PRIMARY KEY вместо INTEGER PRIMARY KEY. В других местах INT и INTEGER означают одно и то же, но только INTEGER PRIMARY KEY заставляет SQLite нумеровать строки. С INT идентификатор остаётся пустым, когда INSERT его пропускает, а первичный ключ не может быть пустым:
CREATE TABLE genres (
id INT PRIMARY KEY,
name TEXT
) STRICT;
INSERT INTO genres (name)
VALUES ('RPG');Error on line 6: NOT NULL constraint failed: genres.idЗадание
- 1
Создайте таблицу
publishersтипаSTRICTдля компаний, которые делают игры, с тремя столбцами:id— целочисленный первичный ключ, затемnameиcountry, оба текстовые. - 2
Вставьте трёх издателей без идентификаторов и позвольте SQLite их пронумеровать (name, country):
'Northwind Games', 'USA''Blue Fox Studio', 'Canada''Pixel Forge', 'UK'
Затем покажите всю таблицу, отсортированную по
id:id name country 1 Northwind Games USA 2 Blue Fox Studio Canada 3 Pixel Forge UK - 3
Перед запросом добавьте издателя с идентификатором 20,
'Sakura Soft', 'Japan', а после него — ещё одного без идентификатора,'Red Panda Games', 'Poland'. Какой идентификатор он получит? Запустите файл и проверьте:id name country 1 Northwind Games USA 2 Blue Fox Studio Canada 3 Pixel Forge UK 20 Sakura Soft Japan 21 Red Panda Games Poland