ALTER TABLE: промяна на таблица
Накратко: ALTER TABLE променя съществуваща таблица, като добавя, преименува или маха колони, а DROP TABLE маха цялата таблица.
Проблем
Куриерът звъни
Куриерът пристига, а клиентът не отваря. Куриерът иска телефон. В customers няма колона за телефон.
Таблицата не може да се направи наново: в нея са 20 клиенти с поръчки, отзиви и дати на регистрация. Трябва да се промени на място.
Идеята
ADD COLUMN
ALTER TABLE променя таблица, която вече съществува. ADD COLUMN добавя колона, написана както в CREATE TABLE:
Старите клиенти получиха NULL: телефоните им още не са известни. Данните в другите колони не се пипат.
Виж го
Задължителна колона в пълна таблица
Маркетингът иска колона „съгласен ли е клиентът с бюлетина“, задължителна:
Грешка. Таблицата вече има 20 реда. Ако колоната е NOT NULL, какво да пише в нея за тях? SQLite не знае и отказва.
С DEFAULT знае:
Всички стари клиенти получиха 0: не са се съгласили, докато не кажат друго.
По-точно, за любопитните
SQLite има още ограничения при ADD COLUMN. Новата колона не може да е UNIQUE или PRIMARY KEY. Ако има REFERENCES и проверката е включена, DEFAULT трябва да е NULL. CHECK за новата колона е позволен: SQLite го проверява и за старите редове.
Пробвай
Мерната единица
Продуктите се продават на брой, но скоро ще има и на килограм. Добави към products колона unit: текст, задължителна, по подразбиране 'бр.'.
Решение
ALTER TABLE products ADD COLUMN unit TEXT NOT NULL DEFAULT 'бр.';ALTER TABLE products ADD COLUMN unit TEXT NOT NULL DEFAULT 'бр.';. Всички 25 продукта получават „бр.“. Ябълките после се поправят с UPDATE.
Идеята
RENAME COLUMN и DROP COLUMN
RENAME COLUMN сменя името на колона. Данните остават:
SQLite сменя името и навсякъде другаде в схемата, където колоната се споменава.
DROP COLUMN маха колона заедно с данните в нея. Магазинът никога няма да праща факс:
DROP COLUMN е в SQLite от версия 3.35 (2021 г.). Не може да махне колона, без която схемата не работи: първичен ключ, UNIQUE колона или колона, по която има индекс или изглед.
Идеята
Какво SQLite не може
Складът иска наличността никога да не е отрицателна. Това е CHECK (stock >= 0) за колона, която вече съществува:
SQLite не може да добави правило към съществуваща колона, нито да смени типа ѝ. ALTER TABLE в SQLite може само да добавя, преименува и маха колони и да преименува таблицата.
За всичко друго се прави нова таблица. Ето как отзивите стават задължително с текст:
Четири стъпки: нова таблица с правилото, пренасяне на данните с INSERT … SELECT, DROP TABLE на старата и RENAME TO на новата. Ако някой отзив беше без текст, пренасянето щеше да спре на NOT NULL. Тогава първо се поправят данните.
По-точно, за любопитните
PostgreSQL и MySQL могат повече: ALTER TABLE products ADD CONSTRAINT stock_ok CHECK (stock >= 0) и смяна на типа на колона. В SQLite пълният ред е в документацията („ALTER TABLE“, раздел за промени, които не се поддържат пряко). Там има и стъпки за външните ключове, индексите и тригерите на старата таблица. Отзивите нямат такива, затова тук стигат четири стъпки.
Идеята
DROP TABLE
DROP TABLE маха цялата таблица, с всички данни. Няма връщане назад. Промоцията от 2025 г. отдавна е свършила:
sqlite_schema е списъкът с таблиците в SQLite. promo_2025 вече я няма. Вторият ред не дава грешка заради IF EXISTS. Без него махането на таблица, която я няма, спира:
Таблица, към която други таблици сочат, не може да се махне така. Към products сочат order_items и reviews:
DROP TABLE първо трие всички редове, а REFERENCES от предния урок не го пуска.
Упражнение
Две промени
1. Куриерите искат телефон и бележка за доставка („звънец 3, вход Б“).
Добави към customers колоните phone и delivery_note, и двете текст.
Решение
ALTER TABLE customers ADD COLUMN phone TEXT;
ALTER TABLE customers ADD COLUMN delivery_note TEXT;Два ALTER TABLE … ADD COLUMN, по един за колона. SQLite добавя само по една колона наведнъж.
2. В reviews датата се казва created_at, а в products е added_at. Добре е еднаквите неща да се казват еднакво.
Преименувай added_at в products на created_at.
Решение
ALTER TABLE products RENAME COLUMN added_at TO created_at;ALTER TABLE products RENAME COLUMN added_at TO created_at;
В истински проект схемата не се мени на ръка в конзолата, а с миграции: файлове с такива ALTER TABLE, които се пускат в един и същ ред на всеки компютър и сървър. Ще ги видиш в модула за базата в програмата.
Тест
Провери се
Свързани уроци
Раздел „Свързани уроци“- Нужно отпреди: INSERT: нови редове · CREATE TABLE: нова таблица · Ограничения: правила за данните · Външни ключове: връзки между таблиците
- Продължава в: Изгледи · Естествен ключ и денормализация · Индекси · Миграции на схемата
- Задачи по темата: Таблици и правила