NOT NULL и DEFAULT
Столбец без правил может остаться пустым: если INSERT его пропускает, в нём окажется NULL. Иногда это правильно, как с датой выхода игры, которая ещё не вышла. Но игра без названия или цены не имеет смысла. NOT NULL после типа столбца говорит, что в нём всегда должно быть значение. Так была создана таблица games магазина Pixel Shop:
CREATE TABLE games (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
genre TEXT NOT NULL,
price INTEGER NOT NULL,
released TEXT,
age_rating INTEGER NOT NULL
) STRICT;У каждого столбца есть NOT NULL, кроме released — единственного, который может остаться пустым. (id он не нужен: первичный ключ никогда не бывает NULL.) INSERT, который пропускает столбец с NOT NULL или записывает в него NULL, завершается ошибкой, как вы видели в прошлом уроке:
INSERT INTO games (title, genre, price)
VALUES ('Snow Trails', 'Sports', 20);Error on line 1: NOT NULL constraint failed: games.age_ratingDEFAULT задаёт столбцу значение, которое он получает, когда INSERT его пропускает. Например, таблица подписчиков на рассылку магазина:
CREATE TABLE subscribers (
id INTEGER PRIMARY KEY,
email TEXT NOT NULL,
language TEXT NOT NULL DEFAULT 'en',
active INTEGER NOT NULL DEFAULT 1
) STRICT;
INSERT INTO subscribers (email)
VALUES ('emma.clark@mail.com');
INSERT INTO subscribers (email, language)
VALUES ('lena.weber@mail.de', 'de');
SELECT * FROM subscribers;| id | language | active | |
|---|---|---|---|
| 1 | emma.clark@mail.com | en | 1 |
| 2 | lena.weber@mail.de | de | 1 |
Никому не пришлось записывать язык первого подписчика или то, что обе подписки активны. NOT NULL и DEFAULT хорошо сочетаются: в столбце всегда есть значение, а INSERT должен его указать, только если оно другое. Эти два слова можно писать в любом порядке. Значением по умолчанию может быть число, текст в одинарных кавычках или CURRENT_DATE — сегодняшняя дата: столбец added TEXT NOT NULL DEFAULT CURRENT_DATE запоминает день, когда каждая строка была вставлена.
Типичная ошибка: думать, что DEFAULT заменяет NULL. Значение по умолчанию используется, только когда INSERT пропускает столбец. NULL, записанный в INSERT, так и остаётся NULL, а при NOT NULL это ошибка:
INSERT INTO subscribers (email, language)
VALUES ('tom.reed@mail.com', NULL);Error on line 1: NOT NULL constraint failed: subscribers.languageЗадание
- 1
Служба поддержки магазина получает обращения от клиентов. Создайте таблицу
ticketsтипаSTRICTс такими столбцами, в таком порядке:id— целочисленный первичный ключ,subject— текст, который всегда должен быть заполнен,status— текст, который всегда должен быть заполнен; еслиINSERTего пропускает, это'open',priority— целое число, которое всегда должно быть заполнено; еслиINSERTего пропускает, это 2.
- 2
Вставьте три обращения, указывая в каждом только перечисленные здесь столбцы:
- тема
'Cannot download Goal Rush', больше ничего, - тема
'Refund for order 18'и статус'closed', - тема
'Wrong price in the cart'и приоритет 1.
Затем покажите всю таблицу, отсортированную по
id:id subject status priority 1 Cannot download Goal Rush open 2 2 Refund for order 18 closed 2 3 Wrong price in the cart open 1 - тема