CREATE TABLE подробно
Учимся создавать таблицы осознанно: столбцы, типы, значения по умолчанию и порядок объявления.
CREATE TABLE — команда, определяющая структуру новой таблицы: имена столбцов, их типы и правила, которым обязаны подчиняться данные.
Анатомия CREATE TABLE
Каждый столбец описывается тремя частями: имя, тип и (необязательно) ограничения. Рассмотрим переносимый пример — его можно запустить.
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
city TEXT DEFAULT 'Москва',
active INTEGER DEFAULT 1
);
INSERT INTO customers (id, name) VALUES (1, 'Анна');
INSERT INTO customers (id, name, city) VALUES (2, 'Борис', 'Казань');
SELECT * FROM customers;
Вывод:
1|Анна|Москва|1 2|Борис|Казань|1
Обратите внимание на Анну: мы не указали ни city, ни active, и база подставила значения по умолчанию — 'Москва' и 1. Это и есть смысл DEFAULT: разумное значение, когда явного нет.
Значения по умолчанию
DEFAULT может быть не только константой, но и выражением или вызовом функции. Это особенно полезно для меток времени.
CREATE TABLE posts (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
views INTEGER DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT now() -- момент вставки подставится сам
);
Теперь при каждой вставке created_at автоматически получит текущий момент, а views начнётся с нуля — об этом не нужно думать в коде приложения.
Временные таблицы
Иногда нужна таблица «на время сессии» — для промежуточных расчётов. Такая таблица исчезнет, когда вы отключитесь.
CREATE TEMPORARY TABLE tmp_report (
category TEXT,
total NUMERIC
);
-- живёт только до конца сессии, потом удаляется автоматически
Удаление и пересоздание
Таблицу удаляют командой DROP TABLE. Очень частая защита от ошибки «таблица не существует» — модификатор IF EXISTS.
DROP TABLE posts; -- удалить таблицу и все её данные
DROP TABLE IF EXISTS posts; -- удалить, но не падать, если её нет
-- Удалить ВСЕ строки, но оставить структуру (быстрее, чем DELETE):
TRUNCATE TABLE posts;
| Команда | Что делает |
DROP TABLE | удаляет таблицу целиком (структуру и данные) |
TRUNCATE | быстро удаляет все строки, структура остаётся |
DELETE FROM | удаляет строки по условию (можно с WHERE) |
Итог
- Столбец = имя + тип + (опционально) ограничения; порядок столбцов задаёте вы.
DEFAULTподставляет значение, когда явного нет; может быть выражением, напримерnow().DROP TABLE [IF EXISTS]удаляет таблицу;TRUNCATEбыстро очищает её, сохраняя структуру.