CREATE TABLE: нова таблица
Накратко: CREATE TABLE създава нова таблица с име, колони и тип за всяка колона, а в SQLite STRICT кара базата да спазва типовете.
Проблем
Тетрадката с доставчиците
Хлябът идва от пекарна, млякото от мандра, препаратите от склад на едро. Телефоните им са в тетрадка до касата. Когато тетрадката се изгуби, никой не знае на кого да звъни.
Мястото им е в базата. Досега таблиците бяха готови. Тази ще направиш ти.
Идеята
CREATE TABLE
CREATE TABLE прави нова таблица: име и в скоби колоните, всяка с тип. Базата тук е празна:
Колоната id INTEGER PRIMARY KEY е първичният ключ. В SQLite такава колона сама получава следващия номер, затова в INSERT я няма. Колоните се отделят със запетая, а след последната няма запетая.
Ето новата таблица:
suppliers
- PK
idinteger nametextcitytextphonetext
По-точно, за любопитните
Таблица, която вече съществува, не може да се направи втори път: SQLite спира с „table suppliers already exists“. CREATE TABLE IF NOT EXISTS suppliers (…) я прави само ако я няма. Това е удобно в скрипт, който се пуска повече от веднъж.
Идеята
Типовете
Типът казва какви стойности ще има в колоната. SQLite има пет:
INTEGER: цяло число. Наличност, брой, номер.REAL: дробно число. Цена, тегло.TEXT: текст. Име, град, телефон.BLOB: байтове такива, каквито са. Снимка, файл.NUMERIC: число, което SQLite пази като цяло, ако може, иначе като дробно.
Отделен тип за дата няма. Датите в магазина са текст във вида '2026-10-25': така се подреждат правилно. Телефонът също е текст, макар да е от цифри: с него не се смята, а нулата отпред трябва да остане.
По-точно, за любопитните
REAL е число с плаваща запетая. То пази повечето дробни числа приблизително, а не точно, и при много сметки се трупат малки грешки. Затова в истински проекти парите често се пазят в центове като INTEGER (250 вместо 2,50) или с тип NUMERIC(10,2) в PostgreSQL и MySQL. В магазина цените са REAL, за да се четат като в касовата бележка.
Пробвай
Доставките
Направи таблица deliveries за доставките: id (първичен ключ), supplier_id (номерът на доставчика, цяло число), delivered_at (датата) и amount (сумата в евро, дробно число като цените в магазина).
Решение
CREATE TABLE deliveries (
id INTEGER PRIMARY KEY,
supplier_id INTEGER,
delivered_at TEXT,
amount REAL
);id INTEGER PRIMARY KEY, supplier_id INTEGER, delivered_at TEXT, amount REAL. Датата е текст, защото SQLite няма тип за дата. Сумата е REAL, защото има центове.
Виж го
Текст в числова колона
Склададжията брои продуктите и записва колко са. Един ден пише „дванадесет“ с думи. Пусни заявката. typeof() казва какъв тип е стойността, която наистина е записана:
И двата реда влизат. '12' става числото 12, защото колоната е INTEGER и SQLite може да го превърне. „дванадесет“ не може да стане число и остава текст в числовата колона.
Това са гъвкавите типове на SQLite (type affinity). Типът на колоната е по-скоро препоръка: SQLite опитва да превърне стойността, но ако не може, я приема каквато е. Отчетът SUM(counted) после тихо ще брои „дванадесет“ като 0.
Идеята
STRICT
Ако след скобите на CREATE TABLE напишеш STRICT, типовете стават правила:
Сега „дванадесет“ не влиза. Текст, който е число, все още се приема и се превръща:
По-точно, за любопитните
В STRICT таблица всяка колона трябва да има тип, и то един от INTEGER (или INT), REAL, TEXT, BLOB и ANY. ANY приема всичко без превръщане. NUMERIC там не е позволен. STRICT таблиците са в SQLite от версия 3.37 (2021 г.). Курсът върви на SQLite 3.49.
Пробвай
Строгото преброяване
Таблицата за преброяването има продукт (product, текст), преброено количество (counted, цяло число) и дата (counted_at). Направи я така, че думи вместо числа да не влизат.
Решение
CREATE TABLE stock_counts (
product TEXT,
counted INTEGER,
counted_at TEXT
) STRICT;Добавяш STRICT след затварящата скоба: ) STRICT;. Колоните остават същите.
Идеята
В PostgreSQL и MySQL
Големите бази имат повече типове. Ще ги срещнеш в почти всяка схема:
VARCHAR(50): текст до 50 знака.NUMERIC(10,2): точно число с 2 знака след запетаята. За пари.DATEиTIMESTAMP: дата, и дата с час.BOOLEAN: вярно или невярно.
SQLite приема тези имена, но не ги спазва:
Кодът е по-дълъг от 5 знака, „да“ не е булева стойност, „до Коледа“ не е дата. SQLite ги записва като текст. PostgreSQL би отказал и трите. Когато пишеш схема за друга база, ползвай нейните типове. Когато я пробваш в SQLite, не разчитай, че те пазят данните.
Упражнение
Доставчиците в магазина
До таблиците на магазина направи suppliers с id (първичен ключ), name и city. Добави двама доставчици: „Пекарна Зора“ от София и „Мандра Балкан“ от Смолян.
Решение
CREATE TABLE suppliers (
id INTEGER PRIMARY KEY,
name TEXT,
city TEXT
);
INSERT INTO suppliers (name, city) VALUES ('Пекарна Зора', 'София'), ('Мандра Балкан', 'Смолян');CREATE TABLE suppliers (id INTEGER PRIMARY KEY, name TEXT, city TEXT); и после един INSERT с два реда. Номерата 1 и 2 идват сами от първичния ключ.
Тест
Провери се
Свързани уроци
Раздел „Свързани уроци“- Нужно отпреди: SELECT: избор на колони · Агрегатни функции: COUNT, SUM, AVG · Първичен и външен ключ · INSERT: нови редове
- Продължава в: Ограничения: правила за данните · Външни ключове: връзки между таблиците · ALTER TABLE: промяна на таблица · Изгледи
- Задачи по темата: Таблици и правила