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

CREATE TABLE: нова таблица

Накратко: CREATE TABLE създава нова таблица с име, колони и тип за всяка колона, а в SQLite STRICT кара базата да спазва типовете.

Проблем

Тетрадката с доставчиците

Хлябът идва от пекарна, млякото от мандра, препаратите от склад на едро. Телефоните им са в тетрадка до касата. Когато тетрадката се изгуби, никой не знае на кого да звъни.

Мястото им е в базата. Досега таблиците бяха готови. Тази ще направиш ти.

Идеята

CREATE TABLE

CREATE TABLE прави нова таблица: име и в скоби колоните, всяка с тип. Базата тук е празна:

SQLпразна база

Колоната id INTEGER PRIMARY KEY е първичният ключ. В SQLite такава колона сама получава следващия номер, затова в INSERT я няма. Колоните се отделят със запетая, а след последната няма запетая.

Ето новата таблица:

suppliers

  • PKidinteger
  • nametext
  • citytext
  • phonetext
По-точно, за любопитните

Таблица, която вече съществува, не може да се направи втори път: 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 (сумата в евро, дробно число като цените в магазина).

SQLпразна база

Виж го

Текст в числова колона

Склададжията брои продуктите и записва колко са. Един ден пише „дванадесет“ с думи. Пусни заявката. typeof() казва какъв тип е стойността, която наистина е записана:

SQLпразна база

И двата реда влизат. '12' става числото 12, защото колоната е INTEGER и SQLite може да го превърне. „дванадесет“ не може да стане число и остава текст в числовата колона.

Това са гъвкавите типове на SQLite (type affinity). Типът на колоната е по-скоро препоръка: SQLite опитва да превърне стойността, но ако не може, я приема каквато е. Отчетът SUM(counted) после тихо ще брои „дванадесет“ като 0.

Идеята

STRICT

Ако след скобите на CREATE TABLE напишеш STRICT, типовете стават правила:

SQLпразна база

Сега „дванадесет“ не влиза. Текст, който е число, все още се приема и се превръща:

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

В STRICT таблица всяка колона трябва да има тип, и то един от INTEGER (или INT), REAL, TEXT, BLOB и ANY. ANY приема всичко без превръщане. NUMERIC там не е позволен. STRICT таблиците са в SQLite от версия 3.37 (2021 г.). Курсът върви на SQLite 3.49.

Пробвай

Строгото преброяване

Таблицата за преброяването има продукт (product, текст), преброено количество (counted, цяло число) и дата (counted_at). Направи я така, че думи вместо числа да не влизат.

SQLпразна база

Идеята

В PostgreSQL и MySQL

Големите бази имат повече типове. Ще ги срещнеш в почти всяка схема:

  • VARCHAR(50): текст до 50 знака.
  • NUMERIC(10,2): точно число с 2 знака след запетаята. За пари.
  • DATE и TIMESTAMP: дата, и дата с час.
  • BOOLEAN: вярно или невярно.

SQLite приема тези имена, но не ги спазва:

SQLпразна база

Кодът е по-дълъг от 5 знака, „да“ не е булева стойност, „до Коледа“ не е дата. SQLite ги записва като текст. PostgreSQL би отказал и трите. Когато пишеш схема за друга база, ползвай нейните типове. Когато я пробваш в SQLite, не разчитай, че те пазят данните.

Упражнение

Доставчиците в магазина

До таблиците на магазина направи suppliers с id (първичен ключ), name и city. Добави двама доставчици: „Пекарна Зора“ от София и „Мандра Балкан“ от Смолян.

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

Тест

Провери се

1. Какъв тип е подходящ за цена като 2,50 €?
2. Таблицата не е STRICT, а колоната counted е INTEGER. Какво става при INSERT на текста „дванадесет“?
3. Как се пазят датите в SQLite?
4. Какво прави STRICT в края на CREATE TABLE?

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