Tablo Oluşturma (CREATE TABLE)

Yeni tablo oluşturma, veri tipleri ve kısıtlamalar

CREATE TABLE Sözdizimi

CREATE TABLE tablo_adi (
    kolon_adi VERI_TIPI KISITLAMALAR,
    ...
);

Temel Veri Tipleri

TipAçıklamaÖrnek
INTEGER / INTTam sayı-2147483648 - 2147483647
SERIALOtomatik artan tam sayı1, 2, 3, ...
BIGINTBüyük tam sayıÇok büyük ID'ler için
NUMERIC(p,s)Kesin ondalıkNUMERIC(10,2) → 12345678.99
DECIMAL(p,s)NUMERIC ile aynıPara için ideal
REAL / FLOAT44 byte ondalıkYaklaşık değerler
VARCHAR(n)Değişken uzunluk metinVARCHAR(255)
TEXTSınırsız metinUzun içerikler
BOOLEANtrue/falseTRUE, FALSE, NULL
DATETarih2024-01-15
TIMESaat14:30:00
TIMESTAMPTarih + Saat2024-01-15 14:30:00
JSONBJSON veri (binary){"key": "value"}
UUIDUnique ID550e8400-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 sil
  • RESTRICT: Bağlı kayıt varsa silmeyi engelle
  • SET NULL: Bağlı kayıtlarda NULL yap
  • SET 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);