Alt sorgulu DML, okuma tutarlılığı, örtük commit, SAVEPOINT ve FOR UPDATE.
Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.
Alt sorgulu DML
-- Alt sorgudan çoklu satır ekleme (VALUES yazılmaz)
INSERT INTO urun_arsiv (product_id, name, price)
SELECT product_id, name, price FROM products WHERE stock = 0;
-- İlişkili alt sorguyla güncelleme
UPDATE employees e
SET salary = (SELECT ROUND(AVG(x.salary)) FROM employees x WHERE x.dept_id = e.dept_id)
WHERE e.salary IS NULL;
-- Alt sorguyla silme
DELETE FROM order_items
WHERE order_id IN (SELECT order_id FROM orders WHERE status = 'cancelled');
-- Alt sorgu hedef olarak (inline view)
UPDATE (SELECT price FROM products WHERE category = 'Kitap') SET price = price * 1.1;
DELETE, TRUNCATE ve DROP
| DELETE | TRUNCATE | DROP |
| Tür | DML | DDL | DDL |
| WHERE | Var | Yok (tümü) | — |
| Geri alınabilir mi? | Evet (ROLLBACK) | Hayır (örtük COMMIT) | Hayır (geri dönüşüm kutusundan FLASHBACK) |
| Trigger | Çalışır | Çalışmaz | — |
| Yapı | Kalır | Kalır, alan serbest kalır | Tablo silinir |
İşlem kontrolü (TCL)
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
SAVEPOINT once_borc;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
ROLLBACK TO SAVEPOINT once_borc; -- yalnızca ikinci UPDATE geri alınır
COMMIT; -- birinci UPDATE kalıcı olur
- Bir işlem ilk DML ile başlar; COMMIT veya ROLLBACK ile biter.
- DDL ve DCL (CREATE, ALTER, DROP, TRUNCATE, GRANT) çalışmadan önce ve sonra örtük COMMIT yapar.
- Oturum normal kapanırsa (çoğu araçta) COMMIT; bağlantı koparsa ROLLBACK.
- Okuma tutarlılığı: Başka oturumlar, sen COMMIT edene kadar değişikliklerini görmez; sen ise kendi değişikliklerini görürsün. Okuyucular yazıcıları, yazıcılar okuyucuları beklemez.
SELECT ... FOR UPDATE seçilen satırları kilitler; diğer oturumlar bu satırları değiştirmek için COMMIT/ROLLBACK'i bekler.
- ROLLBACK TO SAVEPOINT sonrasında, o noktadan sonraki savepoint'ler silinir.