Към съдържанието
wannacode

ALTER TABLE: промяна на таблица

Накратко: ALTER TABLE променя съществуваща таблица, като добавя, преименува или маха колони, а DROP TABLE маха цялата таблица.

Проблем

Куриерът звъни

Куриерът пристига, а клиентът не отваря. Куриерът иска телефон. В customers няма колона за телефон.

Таблицата не може да се направи наново: в нея са 20 клиенти с поръчки, отзиви и дати на регистрация. Трябва да се промени на място.

Идеята

ADD COLUMN

ALTER TABLE променя таблица, която вече съществува. ADD COLUMN добавя колона, написана както в CREATE TABLE:

SQLбаза: магазин

Старите клиенти получиха NULL: телефоните им още не са известни. Данните в другите колони не се пипат.

Виж го

Задължителна колона в пълна таблица

Маркетингът иска колона „съгласен ли е клиентът с бюлетина“, задължителна:

SQLбаза: магазин

Грешка. Таблицата вече има 20 реда. Ако колоната е NOT NULL, какво да пише в нея за тях? SQLite не знае и отказва.

С DEFAULT знае:

SQLбаза: магазин

Всички стари клиенти получиха 0: не са се съгласили, докато не кажат друго.

По-точно, за любопитните

SQLite има още ограничения при ADD COLUMN. Новата колона не може да е UNIQUE или PRIMARY KEY. Ако има REFERENCES и проверката е включена, DEFAULT трябва да е NULL. CHECK за новата колона е позволен: SQLite го проверява и за старите редове.

Пробвай

Мерната единица

Продуктите се продават на брой, но скоро ще има и на килограм. Добави към products колона unit: текст, задължителна, по подразбиране 'бр.'.

SQLбаза: магазин

Идеята

RENAME COLUMN и DROP COLUMN

RENAME COLUMN сменя името на колона. Данните остават:

SQLбаза: магазин

SQLite сменя името и навсякъде другаде в схемата, където колоната се споменава.

DROP COLUMN маха колона заедно с данните в нея. Магазинът никога няма да праща факс:

SQLбаза: магазин

DROP COLUMN е в SQLite от версия 3.35 (2021 г.). Не може да махне колона, без която схемата не работи: първичен ключ, UNIQUE колона или колона, по която има индекс или изглед.

SQLбаза: магазин

Идеята

Какво SQLite не може

Складът иска наличността никога да не е отрицателна. Това е CHECK (stock >= 0) за колона, която вече съществува:

SQLбаза: магазин

SQLite не може да добави правило към съществуваща колона, нито да смени типа ѝ. ALTER TABLE в SQLite може само да добавя, преименува и маха колони и да преименува таблицата.

За всичко друго се прави нова таблица. Ето как отзивите стават задължително с текст:

SQLбаза: магазин

Четири стъпки: нова таблица с правилото, пренасяне на данните с 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 г. отдавна е свършила:

SQLбаза: магазин

sqlite_schema е списъкът с таблиците в SQLite. promo_2025 вече я няма. Вторият ред не дава грешка заради IF EXISTS. Без него махането на таблица, която я няма, спира:

SQLбаза: магазин

Таблица, към която други таблици сочат, не може да се махне така. Към products сочат order_items и reviews:

SQLбаза: магазин

DROP TABLE първо трие всички редове, а REFERENCES от предния урок не го пуска.

Упражнение

Две промени

1. Куриерите искат телефон и бележка за доставка („звънец 3, вход Б“).

Добави към customers колоните phone и delivery_note, и двете текст.

SQLбаза: магазин

2. В reviews датата се казва created_at, а в products е added_at. Добре е еднаквите неща да се казват еднакво.

Преименувай added_at в products на created_at.

SQLбаза: магазин

В истински проект схемата не се мени на ръка в конзолата, а с миграции: файлове с такива ALTER TABLE, които се пускат в един и същ ред на всеки компютър и сървър. Ще ги видиш в модула за базата в програмата.

Тест

Провери се

1. Към таблица с 20 клиенти добавяш колона phone TEXT. Какво има в нея за старите клиенти?
2. Защо ADD COLUMN newsletter INTEGER NOT NULL спира с грешка?
3. Как в SQLite се добавя CHECK към колона, която вече съществува?
4. Какво прави DROP TABLE IF EXISTS promo_2025, ако таблицата я няма?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·