Veri Ekleme (INSERT)

Tabloya yeni veri ekleme, toplu ekleme ve UPSERT

Tek Satır Ekleme

INSERT INTO users (username, email, password_hash)
VALUES ('ahmet', 'ahmet@example.com', 'hash123');
Kullanım Alanları:
  • Yeni kullanıcı kaydı
  • Manuel veri girişi
  • Form verilerini kaydetme

Çoklu Satır Ekleme

INSERT INTO products (name, price, stock, category) VALUES
    ('Laptop', 25000.00, 10, 'Electronics'),
    ('Mouse', 150.00, 50, 'Electronics'),
    ('Keyboard', 500.00, 30, 'Electronics'),
    ('Desk', 2500.00, 15, 'Furniture'),
    ('Chair', 1500.00, 20, 'Furniture');

RETURNING ile ID Alma

-- Eklenen kaydın ID'sini al
INSERT INTO users (username, email, password_hash)
VALUES ('mehmet', 'mehmet@example.com', 'hash456')
RETURNING id;

-- Birden fazla kolon döndür
INSERT INTO orders (user_id, total_amount)
VALUES (1, 599.99)
RETURNING id, order_number, created_at;
id | order_number | created_at ----+----------------+---------------------------- 42 | ORD-2024-00042 | 2024-01-15 14:30:00.123456

SELECT'ten INSERT

-- Başka tablodan kopyala
INSERT INTO archived_orders (id, user_id, total_amount, created_at)
SELECT id, user_id, total_amount, created_at
FROM orders
WHERE created_at < '2023-01-01';

-- Hesaplanmış değerlerle
INSERT INTO monthly_stats (month, total_sales, order_count)
SELECT 
    DATE_TRUNC('month', created_at) AS month,
    SUM(total_amount) AS total_sales,
    COUNT(*) AS order_count
FROM orders
WHERE created_at >= '2024-01-01'
GROUP BY DATE_TRUNC('month', created_at);

ON CONFLICT - UPSERT (Insert or Update)

-- Varsa güncelle, yoksa ekle
INSERT INTO products (sku, name, price, stock)
VALUES ('SKU-001', 'Laptop Pro', 27000.00, 5)
ON CONFLICT (sku) DO UPDATE SET
    name = EXCLUDED.name,
    price = EXCLUDED.price,
    stock = products.stock + EXCLUDED.stock,
    updated_at = NOW();

-- Varsa hiçbir şey yapma
INSERT INTO users (email, username)
VALUES ('test@test.com', 'testuser')
ON CONFLICT (email) DO NOTHING;

-- Birden fazla unique constraint için
INSERT INTO user_settings (user_id, setting_key, setting_value)
VALUES (1, 'theme', 'dark')
ON CONFLICT (user_id, setting_key) DO UPDATE SET
    setting_value = EXCLUDED.setting_value;
EXCLUDED Nedir?
INSERT edilmeye çalışılan (ama çakışan) kayda referans verir. EXCLUDED.price = eklenmek istenen yeni fiyat.