CREATE TABLE Sözdizimi
CREATE TABLE tablo_adi (
kolon_adi VERI_TIPI KISITLAMALAR,
...
);
Temel Veri Tipleri
| Tip | Açıklama | Örnek |
|---|---|---|
| INTEGER / INT | Tam sayı | -2147483648 - 2147483647 |
| SERIAL | Otomatik artan tam sayı | 1, 2, 3, ... |
| BIGINT | Büyük tam sayı | Çok büyük ID'ler için |
| NUMERIC(p,s) | Kesin ondalık | NUMERIC(10,2) → 12345678.99 |
| DECIMAL(p,s) | NUMERIC ile aynı | Para için ideal |
| REAL / FLOAT4 | 4 byte ondalık | Yaklaşık değerler |
| VARCHAR(n) | Değişken uzunluk metin | VARCHAR(255) |
| TEXT | Sınırsız metin | Uzun içerikler |
| BOOLEAN | true/false | TRUE, FALSE, NULL |
| DATE | Tarih | 2024-01-15 |
| TIME | Saat | 14:30:00 |
| TIMESTAMP | Tarih + Saat | 2024-01-15 14:30:00 |
| JSONB | JSON veri (binary) | {"key": "value"} |
| UUID | Unique ID | 550e8400-e29b-41d4-a716... |
Basit Tablo Örneği
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(255) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
full_name VARCHAR(100),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
İlişkisel Tablo (Foreign Key)
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
order_number VARCHAR(50) UNIQUE NOT NULL,
total_amount DECIMAL(10,2) NOT NULL DEFAULT 0,
status VARCHAR(20) DEFAULT 'pending' CHECK (status IN ('pending', 'processing', 'shipped', 'delivered', 'cancelled')),
notes TEXT,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE order_items (
id SERIAL PRIMARY KEY,
order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
product_id INTEGER NOT NULL REFERENCES products(id) ON DELETE RESTRICT,
quantity INTEGER NOT NULL CHECK (quantity > 0),
unit_price DECIMAL(10,2) NOT NULL,
total_price DECIMAL(10,2) GENERATED ALWAYS AS (quantity * unit_price) STORED
);
ON DELETE Seçenekleri:
CASCADE: Ana kayıt silinince bağlı kayıtları da silRESTRICT: Bağlı kayıt varsa silmeyi engelleSET NULL: Bağlı kayıtlarda NULL yapSET DEFAULT: Varsayılan değere döndür
CHECK Constraint ile Doğrulama
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
sku VARCHAR(50) UNIQUE NOT NULL,
price DECIMAL(10,2) NOT NULL CHECK (price > 0),
stock INTEGER NOT NULL DEFAULT 0 CHECK (stock >= 0),
weight DECIMAL(6,2) CHECK (weight > 0),
category VARCHAR(100),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT NOW()
);
JSONB Kolonu ile Tablo
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT,
metadata JSONB DEFAULT '{}'::jsonb,
tags TEXT[] DEFAULT ARRAY[]::TEXT[],
created_at TIMESTAMP DEFAULT NOW()
);
-- JSONB index
CREATE INDEX idx_documents_metadata ON documents USING GIN (metadata);