Bir tablodaki kayıtları kaldırmak için SQL DELETE kullanımını anlayın. Büyük veri kümelerini ele almak için temel sözdizimi, güvenli çalışma akışları ve optimizasyon tekniklerini öğrenin.
SQL'de veri silme potansiyel olarak riskli bir işlemdir. Kötü yazılmış tek bir komut, tablolar arasındaki ilişkileri bozabilir veya tüm bir veri kümesini silebilir.
Bu eğitimde, DELETE ifadesinin nasıl çalıştığını, onu doğru şekilde nasıl kullanacağınızı ve az önce bahsettiğim gibi, tüm bir veri kümesini silmek gibi yaygın hatalardan nasıl kaçınacağınızı göstereceğim.
Sözdizimine bakmadan önce, DELETE ifadesinin gerçekte ne yaptığını anlamak önemlidir. SQL'de verileri kaldırmanın farklı biçimleri aşağıdadır.
Kavramsal olarak SQL DELETE ve satırları kaldırma
DELETE ifadesi, bir tablonun yapısını korurken bir veya daha fazla satırı kaldırır. Dolayısıyla sütun adları, veri türleri, indeksler ve kısıtlar gibi tablo şeması olduğu gibi kalır. Silme işleminden sonra tablo varlığını sürdürür ve yeni verileri kabul etmeye hazırdır.
Bunu, sayfaları koparmak değil, bir defterden girileri silmek gibi düşünün. Şema aynı kalır; yalnızca seçili kayıtlar kaldırılır.
SQL DELETE vs. DROP vs. TRUNCATE
Her ne kadar DELETE, DROP ve TRUNCATE bir biçimde veri kaldırsalar da, çok farklı amaçlara hizmet ederler. Aşağıdaki tablo her ifadenin kullanımını özetler:
Belirli satırları kaldırır (WHERE koşulu kullanılarak)
Bir tablodaki tüm satırları kaldırır
Tüm tabloyu ve verilerini kaldırır.
Hız
Daha yavaş (satır satır kaldırır)
Daha hızlı (sayfaları serbest bırakır)
Anında
Geri Döndürülebilirlik
Geri alınabilir
Geri döndürülemez
Geri döndürülemez.
Tablo Yapısı
Korunur
Korunur (ve kimlikleri sıfırlar)
Tamamen silinir
Temel SQL DELETE Sözdizimi
Artık DELETE ifadesinin nasıl çalıştığını anladığınıza göre, sözdizimine ve nasıl uygulanacağına bakalım.
WHERE ile belirli satırları silme
WHERE koşulu, bir DELETE işleminin kapsamını tanımlar. Veritabanına tam olarak hangi satırların kaldırılması gerektiğini söylediği için WHERE koşulu her zaman gereklidir.
-- Basic DELETE syntaxDELETEFROM table_name
WHERE condition;Altyapı:
Bir tablodaki tüm satırları silme
DELETE ifadesinde WHERE koşulunu atlamanız durumunda, SQL tablodaki her bir satırı hedeflemek istediğinizi varsayar. Bunu yanlışlıkla yaparsanız, veritabanı motoru tek tek her kaydı gözden geçirip siler. Silinen her satır için işlem günlüğüne bir kayıt düşülür. Milyonlarca satırınız varsa bu çok yavaş olabilir ve günlük dosyalarınızın şişmesine neden olabilir.
SQL DELETE Güvenli Uygulamalar
Bir DELETE işlemi kalıcı olabileceğinden, güvenli silme uygulamalarını hayata geçirmek yavaşlamanıza, niyeti doğrulamanıza ve bir şeyler ters gittiğinde/nasıl kurtaracağınıza dair plan yapmanıza yardımcı olur.
Silmeden önce satırları önizleme
DELETE ifadesini çalıştırmadan önce, kaldırmayı planladığınız satırları, DELETE'te kullanmayı planladığınızla aynı WHERE koşuluna sahip bir SELECT ifadesiyle mutlaka önizleyin. SELECT ifadesi çok fazla satır veya yanlış satırlar döndürürse, herhangi bir zarar oluşmadan önce koşulu düzeltebilirsiniz.
Örneğin, aşağıdaki sorgu 2023-01-01 tarihinden önce iptal edilmiş siparişleri kontrol eder ve ardından bu kayıtları silmek için aynı filtreleri kullanır.
-- Step 1: Preview the targetsSELECT*FROM Orders
WHEREStatus='Cancelled'AND OrderDate <'2023-01-01';-- Step 2: Once you've verified the list, convert to DELETEDELETEFROM Orders
WHEREStatus='Cancelled'AND OrderDate <'2023-01-01';Altyapı:
İşlemler ve geri alma kullanımı
DELETE işlemini bir işlemin (transaction) içine alırsanız, bir komutu çalıştırmanıza, kaç satırın etkilendiğini görmenize ve ardından değişikliği kalıcı hale getirip getirmemeye veya tamamen geri almaya karar vermenize olanak tanır. Ardından ROLLBACK kullanarak verileri önceki durumuna geri yükleyebilirsiniz.
Aşağıdaki sorgu, uygun satırları geçici olarak siler ve ardından geri yükler; böylece veri kaybetmeden etkiyi doğrulamanıza imkân tanır.
BEGINTRANSACTION;DELETEFROM Users
WHERE LastLogin <'2020-01-01';-- Inspect the affected row countROLLBACK;Altyapı:
Ardından aşağıdaki sorguyu kullanarak 1 Ocak 2020'den önce son kez oturum açmış kullanıcıları kalıcı olarak silebilirsiniz.
BEGINTRANSACTION;DELETEFROM Users
WHERE LastLogin <'2020-01-01';-- Confirm deletion of the required rowsCOMMIT;Altyapı:
Ancak, ROLLBACK'in yalnızca işlemi henüz commit etmediyseniz mümkün olduğunu unutmamalısınız.
Join ve Alt Sorgularla SQL DELETE
Gerçek dünyadaki veritabanlarında, veriler nadiren izole halde bulunur. Çoğu durumda, başka tablolarda tutulan değerlere, süresi dolmuş hesaplara, yetim kayıtlara veya artık geçerli olmayan ilişkili varlıklara göre satırları silmeniz gerekebilir.
Başka bir tabloya göre satır silme
Alt sorgular kullanmak, başka bir tabloya göre satır silmek için en taşınabilir ve en yaygın desteklenen yaklaşımdır. Neredeyse tüm SQL sürümlerinde çalışırlar. Örneğin, aşağıdaki sorgu, Accounts tablosunda hesabı devre dışı bırakılmış olan Users tablosundaki etkin olmayan kullanıcıları siler.
-- Delete users whose accounts have been deactivatedDELETEFROM Users
WHERE AccountId IN(SELECT AccountId
FROM Accounts
WHEREStatus='DEACTIVATED');Altyapı:
Veritabanında satır silmek için Join'ler de kullanılabilir, ancak sözdizimi veritabanına göre değişir; bunu bir sonraki bölümde göreceğiz.
Veritabanına özgü DELETE sözdizimi
SQL'de DELETE ifadesinin fikri aynı olsa da, JOIN kullanarak bir tablodan diğerine göre satır silerken farklı veritabanlarının farklı sözdizimleri vardır.
SQL Server hedef tabloyu DELETE ifadesinden sonra, ardından FROM içinde join'ler. Aşağıdaki örnekte, DELETE'ten sonraki kısaltma (u) hangi tablonun silindiğini belirtir.
-- SQL Server: Delete users linked to deactivated accountsDELETE u
FROM Users u
JOIN Accounts a
ON u.AccountId = a.AccountId
WHERE a.Status='DEACTIVATED';Altyapı:
PostgreSQL'de USING bir JOIN gibi davranır. Yalnızca hedef tablodaki (Users) satırlar silinir.
-- PostgreSQL: Delete users linked to deactivated accountsDELETEFROM Users
USING Accounts
WHERE Users.AccountId = Accounts.AccountId
AND Accounts.Status='DEACTIVATED';Altyapı:
MySQL çoklu tablo silmelerine izin verir ancak tablo adının açıkça belirtilmesini gerektirir. Silinecek tabloyu FROM ifadesinden önce yerleştirmelisiniz.
-- MySQL: Delete users linked to deactivated accountsDELETE u
FROM Users u
JOIN Accounts a
ON u.AccountId = a.AccountId
WHERE a.Status='DEACTIVATED';Altyapı:
Şunu öneririm: Joining Data in SQL kursumuzu alarak SQL'de farklı join türlerini ve veritabanındaki ilişkili farklı tablolarla nasıl çalışılacağını öğrenin.
SQL DELETE ve Bağlamsal Bütünlük
Artık biliyoruz ki, ilişkisel bir veritabanında tablolar nadiren tek başına bulunur. Genellikle yabancı anahtarlar kullanılarak birbirine bağlanırlar. Bu bağlantılar nedeniyle, bir tabloda bir satırı silmek istenmeyen sonuçlara yol açabilir.
Yabancı anahtarlar ve kısıtlama hataları
Bir tablo bir yabancı anahtar tarafından başvurulduğunda, veritabanı, bir üst satırı silmeye çalıştığınızda ne olacağına dair kuralları uygular. Varsayılan olarak, çoğu veritabanı, alt tabloda ilişkili satırlar hâlâ varsa silmeyi engeller.
Örneğin, Orders tablosunun Customers tablosuna başvurduğu bir durumda, hâlâ siparişi bulunan bir müşteriyi silmek, bir kısıtlama hatasıyla başarısız olur. Bu, veritabanını geçerli bir üst öğesi olmayan yetim kayıtlar içermekten korur.
Kaskat silmeler
İlişkili verileri otomatik olarak silmek istiyorsanız, veritabanına ilişkili verileri nasıl ele alacağını söyleyen bir kademeli (cascading) kuralı açıkça tanımlamanız gerekir. ON DELETE CASCADE, bir üst satır kaldırıldığında ilişkili alt satırların otomatik olarak silinmesini söyler.
Örneğin, aşağıdaki sorgu, Customers tablosundan bir müşteri silindiğinde, o müşteriye referans veren Orders tablosundaki tüm satırların otomatik olarak silinmesini veritabanına bildirir.
-- Parent tableCREATETABLE Customers (
CustomerId INTPRIMARYKEY,
Name VARCHAR(100));-- Child table with a cascading foreign keyCREATETABLE Orders (
OrderId INTPRIMARYKEY,
CustomerId INT,
OrderDate DATE,CONSTRAINT fk_orders_customers
FOREIGNKEY(CustomerId)REFERENCES Customers(CustomerId)ONDELETECASCADE);Altyapı:
Bu yaklaşımın avantajı, birden çok manuel DELETE ifadesi gerektirmeden veritabanını temiz tutmasıdır. Ancak, tek bir silmenin birden çok tablo arasında zincirleme bir tepkiyi tetikleyerek beklenenden çok daha fazla veriyi kaldırabileceği için ifadeyi dikkatli kullanmalısınız. Örneğin, Departments tablosunda bir satırı siler ve yanlışlıkla Employees tablosunda 500 satırı silebilirsiniz.
Veri Silerken Performansla İlgili Hususlar
DELETE ifadesini kullandıkça, birkaç satır silmenin anlık olduğunu, ancak milyonlarca satır varsa yavaşladığını fark edeceksiniz. Kayıtları güvenle silmek için şu en iyi uygulamaları değerlendirin:
Büyük tablolar için DELETE vs. TRUNCATE
Daha önce gördüğümüz gibi, DELETE ve TRUNCATE kayıtları şu şekillerde kaldırır:
DELETE: Her satırı tek tek inceler, ölçütleri karşılayıp karşılamadığını kontrol eder, kaldırır ve değişikliği işlem günlüğüne kaydeder. Çok büyük veri kümeleri için kaynak tüketimi fazladır ve yavaştır. WHERE koşuluyla filtrelemeye izin verir ve geri almayı destekler.
TRUNCATE: Tüm satırları aynı anda asgari günlüklemeyle kaldırır. Kayda değer ölçüde daha hızlıdır ancak filtrelenemez, genellikle geri alınamaz ve yabancı anahtar kısıtları tarafından engellenir.
Toplu silmeler ve uzun süreli işlemler
Tek bir ifadeyle milyonlarca satır silerseniz, bu tüm uygulamanızı önemli ölçüde yavaşlatabilir ve doğru şekilde ele alınmazsa veritabanınızın çökmesine bile neden olabilir. Bu riski azaltmak için, büyük veri kümelerini her zaman partiler (batch) halinde silin.
Toplu silmeler, her işlemde birkaç bin gibi sınırlı sayıda satırı kaldırır. Bu, veritabanının duyarlı kalmasını sağlar ve ilerlemenin kolay izlenmesine olanak tanır. Bir şeyler ters giderse, devasa bir işlemi geri almak zorunda kalmadan süreci durdurabilirsiniz.
SQL DELETE Sık Yapılan Hatalar
Tablolarınızdaki satırları kaldırmak için DELETE ifadesini kullanırken dikkat etmeniz gereken yaygın hatalar şunlardır:
WHERE koşulunu unutmak
DELETE kullanırken en yaygın hata WHERE koşulunu unutmaktır. Bu olmadan ifade, tablodaki her satırı kaldırır. Hangi satırları sileceğinizi belirtmek için her zaman WHERE koşulunu kullandığınızdan emin olun. Önleyici bir önlem olarak, satırları silmeden önce görmenizi sağlayan daha önce bahsettiğimiz DELETE'ten önce SELECT alışkanlığını kullanın.
DELETE'in geri döndürülebilir olduğunu varsaymak
Bir diğer yaygın yanlış kanı, silinen verilerin her zaman kurtarılabileceğidir. Varsayılan olarak, DELETE ifadesi commit edildikten sonra, yedekler, replikalar veya denetim günlükleri yoksa verileri diskten fiziksel olarak kaldırılmış olarak işaretlediğini unutmayın.
Bir DELETE komutunu yalnızca şu durumlarda “geri alabilirsiniz”:
Bir işlem içinde yürütülmüşse.
İşlem commit edilmemişse.
Veritabanı ve depolama motoru geri almayı destekliyorsa.
Canlı (Prod) Ortamlarda SQL DELETE
Canlı sistemlerde, DELETE işlemi sözdiziminden ziyade kontrol, görünürlük ve hesap verebilirlikle ilgilidir. Bu tür ortamlarda amaç yalnızca veriyi kaldırmak değil, bunu güvenle ve bilinçli şekilde yapmaktır.
Erişim kontrolü ve izinler
Profesyonel bir ortamda, veri silme yetkisi En Az Ayrıcalık İlkesine uymalıdır. Her kullanıcı veya uygulama servis hesabı DELETE izinlerine sahip olmamalıdır.
Çoğu "Salt Okunur" kullanıcı veya raporlama aracına bu hak açıkça reddedilmelidir. Çoğu şirket genellikle bir “Akran İncelemesi” ister; burada, üretimde çalıştırılmadan önce manuel silme betiğinin WHERE koşulunun ikinci bir kişi tarafından doğrulanması gerekir.
İşinizin bir parçası olarak düzenli olarak veritabanı tasarlıyor veya bakımı yapıyorsanız, SQL Server for Database Administrators yetkinlik yolunu denemenizi öneririm; düzenli olarak veritabanları tasarlıyor veya bakımını yapıyorsanız.
Denetim ve yumuşak silmeler (soft delete)
Birçok canlı sistem, riskleri nedeniyle sert silmelerden kaçınır. Bunun yerine, bir satırın silinmiş olarak işaretlendiği yumuşak silmeleri kullanırlar. Örneğin, bir kaydı fiziksel olarak kaldırmak yerine bir deleted_at zaman damgası veya is_deleted bayrağı kullanabilirsiniz.
Yumuşak silmeler, kurtarmayı kolaylaştırır, denetimi destekler ve hata ayıklama ile uyumluluk amaçları için geçmiş verileri korur.
Sonuç
En önemli çıkarım şudur: Her zaman net bir WHERE koşulu tanımlayın, etkilenen satırları SELECT ile önizleyin ve mümkün olduğunda işlemleri kullanın. Canlı sistemlerde her silme işlemi kasıtlı ve denetlenebilir olmalıdır. DELETE'i, bir şema değişikliği veya dağıtım kadar dikkatle ele alın; böylece maliyetli bir hatadan ziyade faydalı bir araç olarak kalır.
Şunu öneririm: Database Design kursumuzu alarak veritabanlarını oluşturmayı ve yönetmeyi, ayrıca ihtiyaçlarınıza uygun VTYS'yi seçmeyi öğrenin. Ayrıca, veri mühendisliği ve veri ambarı temellerini öğrenmek için Associate Data Engineer in SQL kariyer yolumuzu denemenizi de tavsiye ederim.
Veri analitiği, iş zekâsı ve veri bilimi alanlarında pratik deneyime sahip Veri Bilimi Teknik Yazarı. SQL, Python, Power BI, Databricks ve veri mühendisliği üzerine, gerçek dünya analitik çalışmalarına dayanan, uygulamaya dönük ve sektöre odaklı içerikler yazıyorum. Yazılarım teknik derinlikle iş etkisi arasındaki köprüyü kurarak profesyonellerin veriyi güvenle karara dönüştürmelerine yardımcı olur.
SQL DELETE SSS
DELETE, TRUNCATE veya DROP'tan nasıl farklıdır?⌄
DELETE seçili satırları kaldırır, TRUNCATE tüm satırları hızla kaldırır ve DROP tablonun kendisini siler.
DELETE'te WHERE koşulu neden önemlidir?⌄
WHERE koşulu olmadan, DELETE tüm satırları kaldırır ve tam veri kaybı riski doğurur.
Bazı DELETE işlemleri neden başarısız olur?⌄
Yabancı anahtar kısıtları, kaskat kurallar olmadan bağımlı alt satırlar varsa silmeyi engeller.
Silinecekleri güvenle nasıl önizleyebilirim?⌄
Aynı WHERE koşuluyla bir SELECT ifadesi kullanarak silmeden önce etkilenecek satırları inceleyin.
Büyük veri kümelerini güvenle nasıl silebilirim?⌄
Uzun süren işlemler ve performans sorunlarını önlemek için satırları partiler hâlinde silen toplu silmeleri kullanın.
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
SQL'de veri silme potansiyel olarak riskli bir işlemdir. Kötü yazılmış tek bir komut, tablolar arasındaki ilişkileri bozabilir veya tüm bir veri kümesini silebilir.
Bu eğitimde,
DELETEifadesinin nasıl çalıştığını, onu doğru şekilde nasıl kullanacağınızı ve az önce bahsettiğim gibi, tüm bir veri kümesini silmek gibi yaygın hatalardan nasıl kaçınacağınızı göstereceğim.SQL'e yeniyseniz, Introduction to SQL kursumuzla başlayın veya biraz deneyiminiz varsa Intermediate SQL kursunu deneyin.
DELETE SQL'de Ne İşe Yarar?
Sözdizimine bakmadan önce,
DELETEifadesinin gerçekte ne yaptığını anlamak önemlidir. SQL'de verileri kaldırmanın farklı biçimleri aşağıdadır.Kavramsal olarak SQL DELETE ve satırları kaldırma
DELETEifadesi, bir tablonun yapısını korurken bir veya daha fazla satırı kaldırır. Dolayısıyla sütun adları, veri türleri, indeksler ve kısıtlar gibi tablo şeması olduğu gibi kalır. Silme işleminden sonra tablo varlığını sürdürür ve yeni verileri kabul etmeye hazırdır.Bunu, sayfaları koparmak değil, bir defterden girileri silmek gibi düşünün. Şema aynı kalır; yalnızca seçili kayıtlar kaldırılır.
SQL DELETE vs. DROP vs. TRUNCATE
Her ne kadar
DELETE,DROPveTRUNCATEbir biçimde veri kaldırsalar da, çok farklı amaçlara hizmet ederler. Aşağıdaki tablo her ifadenin kullanımını özetler:Özellikler
DELETE
TRUNCATE
DROP
Komut Türü
DML (Data Manipulation Language)
DDL (Data Definition Language)
DDL (Data Definition Language)
Kapsam
Belirli satırları kaldırır (
WHEREkoşulu kullanılarak)Bir tablodaki tüm satırları kaldırır
Tüm tabloyu ve verilerini kaldırır.
Hız
Daha yavaş (satır satır kaldırır)
Daha hızlı (sayfaları serbest bırakır)
Anında
Geri Döndürülebilirlik
Geri alınabilir
Geri döndürülemez
Geri döndürülemez.
Tablo Yapısı
Korunur
Korunur (ve kimlikleri sıfırlar)
Tamamen silinir
Temel SQL DELETE Sözdizimi
Artık
DELETEifadesinin nasıl çalıştığını anladığınıza göre, sözdizimine ve nasıl uygulanacağına bakalım.WHERE ile belirli satırları silme
WHEREkoşulu, birDELETEişleminin kapsamını tanımlar. Veritabanına tam olarak hangi satırların kaldırılması gerektiğini söylediği içinWHEREkoşulu her zaman gereklidir.Bir tablodaki tüm satırları silme
DELETEifadesindeWHEREkoşulunu atlamanız durumunda, SQL tablodaki her bir satırı hedeflemek istediğinizi varsayar. Bunu yanlışlıkla yaparsanız, veritabanı motoru tek tek her kaydı gözden geçirip siler. Silinen her satır için işlem günlüğüne bir kayıt düşülür. Milyonlarca satırınız varsa bu çok yavaş olabilir ve günlük dosyalarınızın şişmesine neden olabilir.SQL DELETE Güvenli Uygulamalar
Bir
DELETEişlemi kalıcı olabileceğinden, güvenli silme uygulamalarını hayata geçirmek yavaşlamanıza, niyeti doğrulamanıza ve bir şeyler ters gittiğinde/nasıl kurtaracağınıza dair plan yapmanıza yardımcı olur.Silmeden önce satırları önizleme
DELETEifadesini çalıştırmadan önce, kaldırmayı planladığınız satırları,DELETE'te kullanmayı planladığınızla aynıWHEREkoşuluna sahip birSELECTifadesiyle mutlaka önizleyin.SELECTifadesi çok fazla satır veya yanlış satırlar döndürürse, herhangi bir zarar oluşmadan önce koşulu düzeltebilirsiniz.Örneğin, aşağıdaki sorgu
2023-01-01tarihinden önce iptal edilmiş siparişleri kontrol eder ve ardından bu kayıtları silmek için aynı filtreleri kullanır.İşlemler ve geri alma kullanımı
DELETEişlemini bir işlemin (transaction) içine alırsanız, bir komutu çalıştırmanıza, kaç satırın etkilendiğini görmenize ve ardından değişikliği kalıcı hale getirip getirmemeye veya tamamen geri almaya karar vermenize olanak tanır. ArdındanROLLBACKkullanarak verileri önceki durumuna geri yükleyebilirsiniz.Aşağıdaki sorgu, uygun satırları geçici olarak siler ve ardından geri yükler; böylece veri kaybetmeden etkiyi doğrulamanıza imkân tanır.
Ardından aşağıdaki sorguyu kullanarak 1 Ocak 2020'den önce son kez oturum açmış kullanıcıları kalıcı olarak silebilirsiniz.
Ancak,
ROLLBACK'in yalnızca işlemi henüz commit etmediyseniz mümkün olduğunu unutmamalısınız.Join ve Alt Sorgularla SQL DELETE
Gerçek dünyadaki veritabanlarında, veriler nadiren izole halde bulunur. Çoğu durumda, başka tablolarda tutulan değerlere, süresi dolmuş hesaplara, yetim kayıtlara veya artık geçerli olmayan ilişkili varlıklara göre satırları silmeniz gerekebilir.
Başka bir tabloya göre satır silme
Alt sorgular kullanmak, başka bir tabloya göre satır silmek için en taşınabilir ve en yaygın desteklenen yaklaşımdır. Neredeyse tüm SQL sürümlerinde çalışırlar. Örneğin, aşağıdaki sorgu,
Accountstablosunda hesabı devre dışı bırakılmış olanUserstablosundaki etkin olmayan kullanıcıları siler.Veritabanında satır silmek için Join'ler de kullanılabilir, ancak sözdizimi veritabanına göre değişir; bunu bir sonraki bölümde göreceğiz.
Veritabanına özgü DELETE sözdizimi
SQL'de
DELETEifadesinin fikri aynı olsa da,JOINkullanarak bir tablodan diğerine göre satır silerken farklı veritabanlarının farklı sözdizimleri vardır.SQL Server hedef tabloyu
DELETEifadesinden sonra, ardındanFROMiçinde join'ler. Aşağıdaki örnekte,DELETE'ten sonraki kısaltma (u) hangi tablonun silindiğini belirtir.PostgreSQL'de
USINGbirJOINgibi davranır. Yalnızca hedef tablodaki (Users) satırlar silinir.MySQL çoklu tablo silmelerine izin verir ancak tablo adının açıkça belirtilmesini gerektirir. Silinecek tabloyu
FROMifadesinden önce yerleştirmelisiniz.Şunu öneririm: Joining Data in SQL kursumuzu alarak SQL'de farklı join türlerini ve veritabanındaki ilişkili farklı tablolarla nasıl çalışılacağını öğrenin.
SQL DELETE ve Bağlamsal Bütünlük
Artık biliyoruz ki, ilişkisel bir veritabanında tablolar nadiren tek başına bulunur. Genellikle yabancı anahtarlar kullanılarak birbirine bağlanırlar. Bu bağlantılar nedeniyle, bir tabloda bir satırı silmek istenmeyen sonuçlara yol açabilir.
Yabancı anahtarlar ve kısıtlama hataları
Bir tablo bir yabancı anahtar tarafından başvurulduğunda, veritabanı, bir üst satırı silmeye çalıştığınızda ne olacağına dair kuralları uygular. Varsayılan olarak, çoğu veritabanı, alt tabloda ilişkili satırlar hâlâ varsa silmeyi engeller.
Örneğin,
OrderstablosununCustomerstablosuna başvurduğu bir durumda, hâlâ siparişi bulunan bir müşteriyi silmek, bir kısıtlama hatasıyla başarısız olur. Bu, veritabanını geçerli bir üst öğesi olmayan yetim kayıtlar içermekten korur.Kaskat silmeler
İlişkili verileri otomatik olarak silmek istiyorsanız, veritabanına ilişkili verileri nasıl ele alacağını söyleyen bir kademeli (cascading) kuralı açıkça tanımlamanız gerekir.
ON DELETE CASCADE, bir üst satır kaldırıldığında ilişkili alt satırların otomatik olarak silinmesini söyler.Örneğin, aşağıdaki sorgu,
Customerstablosundan bir müşteri silindiğinde, o müşteriye referans verenOrderstablosundaki tüm satırların otomatik olarak silinmesini veritabanına bildirir.Bu yaklaşımın avantajı, birden çok manuel
DELETEifadesi gerektirmeden veritabanını temiz tutmasıdır. Ancak, tek bir silmenin birden çok tablo arasında zincirleme bir tepkiyi tetikleyerek beklenenden çok daha fazla veriyi kaldırabileceği için ifadeyi dikkatli kullanmalısınız. Örneğin,Departmentstablosunda bir satırı siler ve yanlışlıklaEmployeestablosunda 500 satırı silebilirsiniz.Veri Silerken Performansla İlgili Hususlar
DELETEifadesini kullandıkça, birkaç satır silmenin anlık olduğunu, ancak milyonlarca satır varsa yavaşladığını fark edeceksiniz. Kayıtları güvenle silmek için şu en iyi uygulamaları değerlendirin:Büyük tablolar için DELETE vs. TRUNCATE
Daha önce gördüğümüz gibi,
DELETEveTRUNCATEkayıtları şu şekillerde kaldırır:DELETE: Her satırı tek tek inceler, ölçütleri karşılayıp karşılamadığını kontrol eder, kaldırır ve değişikliği işlem günlüğüne kaydeder. Çok büyük veri kümeleri için kaynak tüketimi fazladır ve yavaştır.WHEREkoşuluyla filtrelemeye izin verir ve geri almayı destekler.TRUNCATE: Tüm satırları aynı anda asgari günlüklemeyle kaldırır. Kayda değer ölçüde daha hızlıdır ancak filtrelenemez, genellikle geri alınamaz ve yabancı anahtar kısıtları tarafından engellenir.Toplu silmeler ve uzun süreli işlemler
Tek bir ifadeyle milyonlarca satır silerseniz, bu tüm uygulamanızı önemli ölçüde yavaşlatabilir ve doğru şekilde ele alınmazsa veritabanınızın çökmesine bile neden olabilir. Bu riski azaltmak için, büyük veri kümelerini her zaman partiler (batch) halinde silin.
Toplu silmeler, her işlemde birkaç bin gibi sınırlı sayıda satırı kaldırır. Bu, veritabanının duyarlı kalmasını sağlar ve ilerlemenin kolay izlenmesine olanak tanır. Bir şeyler ters giderse, devasa bir işlemi geri almak zorunda kalmadan süreci durdurabilirsiniz.
SQL DELETE Sık Yapılan Hatalar
Tablolarınızdaki satırları kaldırmak için DELETE ifadesini kullanırken dikkat etmeniz gereken yaygın hatalar şunlardır:
WHERE koşulunu unutmak
DELETEkullanırken en yaygın hataWHEREkoşulunu unutmaktır. Bu olmadan ifade, tablodaki her satırı kaldırır. Hangi satırları sileceğinizi belirtmek için her zamanWHEREkoşulunu kullandığınızdan emin olun. Önleyici bir önlem olarak, satırları silmeden önce görmenizi sağlayan daha önce bahsettiğimizDELETE'ten önceSELECTalışkanlığını kullanın.DELETE'in geri döndürülebilir olduğunu varsaymak
Bir diğer yaygın yanlış kanı, silinen verilerin her zaman kurtarılabileceğidir. Varsayılan olarak,
DELETEifadesi commit edildikten sonra, yedekler, replikalar veya denetim günlükleri yoksa verileri diskten fiziksel olarak kaldırılmış olarak işaretlediğini unutmayın.Bir
DELETEkomutunu yalnızca şu durumlarda “geri alabilirsiniz”:Canlı (Prod) Ortamlarda SQL DELETE
Canlı sistemlerde,
DELETEişlemi sözdiziminden ziyade kontrol, görünürlük ve hesap verebilirlikle ilgilidir. Bu tür ortamlarda amaç yalnızca veriyi kaldırmak değil, bunu güvenle ve bilinçli şekilde yapmaktır.Erişim kontrolü ve izinler
Profesyonel bir ortamda, veri silme yetkisi En Az Ayrıcalık İlkesine uymalıdır. Her kullanıcı veya uygulama servis hesabı
DELETEizinlerine sahip olmamalıdır.Çoğu "Salt Okunur" kullanıcı veya raporlama aracına bu hak açıkça reddedilmelidir. Çoğu şirket genellikle bir “Akran İncelemesi” ister; burada, üretimde çalıştırılmadan önce manuel silme betiğinin
WHEREkoşulunun ikinci bir kişi tarafından doğrulanması gerekir.İşinizin bir parçası olarak düzenli olarak veritabanı tasarlıyor veya bakımı yapıyorsanız, SQL Server for Database Administrators yetkinlik yolunu denemenizi öneririm; düzenli olarak veritabanları tasarlıyor veya bakımını yapıyorsanız.
Denetim ve yumuşak silmeler (soft delete)
Birçok canlı sistem, riskleri nedeniyle sert silmelerden kaçınır. Bunun yerine, bir satırın silinmiş olarak işaretlendiği yumuşak silmeleri kullanırlar. Örneğin, bir kaydı fiziksel olarak kaldırmak yerine bir
deleted_atzaman damgası veyais_deletedbayrağı kullanabilirsiniz.Yumuşak silmeler, kurtarmayı kolaylaştırır, denetimi destekler ve hata ayıklama ile uyumluluk amaçları için geçmiş verileri korur.
Sonuç
En önemli çıkarım şudur: Her zaman net bir
WHEREkoşulu tanımlayın, etkilenen satırlarıSELECTile önizleyin ve mümkün olduğunda işlemleri kullanın. Canlı sistemlerde her silme işlemi kasıtlı ve denetlenebilir olmalıdır.DELETE'i, bir şema değişikliği veya dağıtım kadar dikkatle ele alın; böylece maliyetli bir hatadan ziyade faydalı bir araç olarak kalır.Şunu öneririm: Database Design kursumuzu alarak veritabanlarını oluşturmayı ve yönetmeyi, ayrıca ihtiyaçlarınıza uygun VTYS'yi seçmeyi öğrenin. Ayrıca, veri mühendisliği ve veri ambarı temellerini öğrenmek için Associate Data Engineer in SQL kariyer yolumuzu denemenizi de tavsiye ederim.