- Konu sahibi
- #1
SQL tablosundaki verileri silmek için genellikle
Örneğin
Bu sorgu,
Silinecek kayıtları önce
Sonuçta beklediğiniz satır görünüyorsa aynı
Bu örnek yalnızca durumu
Tablonun yapısını koruyup bütün satırları kaldırmak için
Bu komut tablodaki tüm satırları siler; tablo, sütunlar ve çoğu tablo tanımı yerinde kalır. Kayıtların tamamını silmek istiyor olsanız bile bu komutu doğrudan çalıştırmadan önce tablo adını ve bağlı uygulamaları kontrol edin. Yanlış tablo adı kullanılması geri dönüşü zor bir veri kaybına yol açabilir.
Tüm satırları temizlemek için bazı veritabanlarında
Ancak
Tabloyu tamamen ortadan kaldırmak istiyorsanız kullanılan komut
Bu işlem yalnızca kayıtları değil, tablonun kendisini de kaldırır. Dolayısıyla "tablodaki verileri silmek" ile "tabloyu silmek" aynı şey değildir. Tablonun yapısını, sütunlarını ve ilişkilerini korumak istiyorsanız
Veritabanınız işlem desteği sağlıyorsa silme işlemini önce bir işlem içinde deneyebilirsiniz:
Sorgu hata veriyorsa hata mesajını, kullandığınız veritabanı ürününü ve sorgunun ilgili bölümünü birlikte inceleyin. Dış anahtar ilişkisi olan bir satırın silinememesi, başka tablolardaki kayıtların bu satıra bağlı olduğunu gösterebilir. Bu durumda bağlı kayıtların silinip silinmeyeceği veya ilişkinin
Sorgu başarıyla çalıştığı hâlde kayıt görünmeye devam ediyorsa aynı bağlantıda doğru tabloyu sorguladığınızı, işlemi
DELETE komutu kullanılır. Belirli kayıtları kaldıracaksanız WHERE koşulu ekleyin; koşulu yazmazsanız tablodaki tüm satırlar silinir. İşlemi çalıştırmadan önce doğru veritabanında ve doğru tabloda olduğunuzu kontrol edin. Geri alınabilir bir işlem yapmak istiyorsanız komutu bir işlem bloğu içinde çalıştırıp sonucu doğruladıktan sonra COMMIT uygulayın.Belirli kayıtları silme
Örneğin
users tablosunda kimliği 25 olan kaydı silmek için şu sorgu kullanılır:
SQL:
DELETE FROM users
WHERE id = 25;
Bu sorgu,
id değeri 25 olan satırı silmeyi dener. Beklenen sonuç, sorgunun bir satırı etkilemesidir. Hiçbir satır etkilenmezse bu koşula uyan kayıt yoktur; bu durum sorgunun hata verdiğini veya başka bir kaydın silindiğini göstermez. Birden fazla satır etkilenirse WHERE koşulu birden fazla kaydı eşleştiriyor demektir.Silinecek kayıtları önce
SELECT ile kontrol etmek güvenli bir alışkanlıktır:
SQL:
SELECT *
FROM users
WHERE id = 25;
Sonuçta beklediğiniz satır görünüyorsa aynı
WHERE koşulunu DELETE sorgusunda kullanabilirsiniz. Koşulun belirli bir değer yerine tarih, durum veya başka bir alanla kurulması da mümkündür:
SQL:
DELETE FROM orders
WHERE status = 'cancelled'
AND created_at < '2025-01-01';
Bu örnek yalnızca durumu
cancelled olan ve belirtilen tarihten önce oluşturulan siparişleri hedefler. Tarih biçimi ve sütun türü kullandığınız veritabanı sistemine göre değişebileceği için önce aynı koşulla SELECT çalıştırarak eşleşen kayıt sayısını kontrol edin.Tablodaki tüm satırları silme
Tablonun yapısını koruyup bütün satırları kaldırmak için
WHERE içermeyen DELETE kullanılabilir:
SQL:
DELETE FROM users;
Bu komut tablodaki tüm satırları siler; tablo, sütunlar ve çoğu tablo tanımı yerinde kalır. Kayıtların tamamını silmek istiyor olsanız bile bu komutu doğrudan çalıştırmadan önce tablo adını ve bağlı uygulamaları kontrol edin. Yanlış tablo adı kullanılması geri dönüşü zor bir veri kaybına yol açabilir.
Tüm satırları temizlemek için bazı veritabanlarında
TRUNCATE daha uygun olabilir:
SQL:
TRUNCATE TABLE users;
Ancak
TRUNCATE davranışı; işlem desteği, otomatik artan sayaçların sıfırlanması, dış anahtar kısıtlamaları ve geri alma olanağı bakımından veritabanı ürününe göre değişebilir. Bu nedenle DELETE ile TRUNCATE seçimini yalnızca komutun kısa olmasına göre yapmayın.| Komut | Ne yapar? | Ne zaman tercih edilir? |
|---|---|---|
| DELETE... WHERE | Koşula uyan satırları siler. | Belirli kayıtları kaldırırken. |
| DELETE FROM tablo | Tablodaki tüm satırları siler. | Satır satır silme davranışına ihtiyaç duyulduğunda. |
| TRUNCATE TABLE | Tablodaki tüm satırları topluca temizler; ayrıntılı davranışı ürüne göre değişir. | Tablo yapısı korunarak hızlı temizlik gerektiğinde ve kısıtlar doğrulandığında. |
| DROP TABLE | Tablonun kendisini, yani verileri ve tablo tanımını kaldırır. | Tabloya artık hiç ihtiyaç yoksa. |
DROP TABLE olur:
SQL:
DROP TABLE users;
Bu işlem yalnızca kayıtları değil, tablonun kendisini de kaldırır. Dolayısıyla "tablodaki verileri silmek" ile "tabloyu silmek" aynı şey değildir. Tablonun yapısını, sütunlarını ve ilişkilerini korumak istiyorsanız
DROP TABLE kullanmayın.Silme işleminden önce geri alınabilir çalışma
Veritabanınız işlem desteği sağlıyorsa silme işlemini önce bir işlem içinde deneyebilirsiniz:
SQL:
BEGIN;
SELECT *
FROM users
WHERE id = 25;
DELETE FROM users
WHERE id = 25;
-- Sonucu kontrol edin.
-- Doğruysa:
COMMIT;
-- Yanlışsa COMMIT yerine ROLLBACK kullanın:
-- ROLLBACK;
COMMIT, yapılan değişiklikleri kesinleştirir; ROLLBACK ise işlem henüz kesinleştirilmeden önceki duruma dönmeyi dener. Bunun çalışıp çalışmayacağı ve hangi komutların geri alınabileceği kullanılan veritabanı sistemi, tablo motoru ve bağlantı ayarlarına bağlıdır. Bu yüzden kritik verilerde ayrıca yedek veya doğrulanmış geri yükleme planı bulunmalıdır; işlem bloğu tek başına yedek değildir.Silme işlemi beklenenden farklı sonuç verirse
Sorgu hata veriyorsa hata mesajını, kullandığınız veritabanı ürününü ve sorgunun ilgili bölümünü birlikte inceleyin. Dış anahtar ilişkisi olan bir satırın silinememesi, başka tablolardaki kayıtların bu satıra bağlı olduğunu gösterebilir. Bu durumda bağlı kayıtların silinip silinmeyeceği veya ilişkinin
ON DELETE davranışının nasıl tanımlandığı belirlenmeden kısıtı kaldırmak güvenli değildir.Sorgu başarıyla çalıştığı hâlde kayıt görünmeye devam ediyorsa aynı bağlantıda doğru tabloyu sorguladığınızı, işlemi
COMMIT ile kesinleştirmeniz gerekip gerekmediğini ve uygulamanın başka bir veritabanına bağlanıp bağlanmadığını kontrol edin. Sorgunun etkilediği satır sayısı da önemlidir: beklenenden fazla satır silindiyse işlemi durdurun, kalan verileri değiştirmeyin ve geri alma olanağı varsa hemen ROLLBACK uygulayın.