
SQL Notları 2-Alter Table-AND-OR Kullanımı
ALTER TABLE
Giriş
SQL’de ALTER
komutu, bir tablodaki sütunları veya kısıtlamaları değiştirmek için kullanılır.
Sözdizimi
ALTER TABLE [tablo_adı] ADD [sütun_adı] [veri_tipi]
Örnekler
Sütun Ekleme
ALTER TABLE Employees
ADD StartingDate DATE NOT NULL DEFAULT GETDATE(),
DateOfBirth DATE NULL;
Yukarıdaki sorgu, Employees
tablosuna StartingDate
ve DateOfBirth
adında iki sütun ekler. StartingDate
sütunu, boş olamaz (NOT NULL
) ve varsayılan değeri mevcut tarih olurken (GETDATE()
), DateOfBirth
sütunu boş olabilir (NULL
).
Sütun Silme
ALTER TABLE Employees
DROP COLUMN Salary;
Bu komut, Employees
tablosundaki Salary
sütununu siler. Bu işlem sadece sütundaki verileri değil, sütunun kendisini de tablo yapısından kaldırır.
Kısıtlama (Constraint) Silme
ALTER TABLE Employees
DROP CONSTRAINT DefaultSalary;
Bu komut, Employees
tablosundaki DefaultSalary
adlı kısıtlamayı kaldırır.
Not: Bir sütunu silmeden önce, o sütuna bağlı kısıtlamaların da silindiğinden emin olun.
Kısıtlama Ekleme
ALTER TABLE Employees
ADD CONSTRAINT DefaultSalary DEFAULT (100) FOR Salary;
Bu sorgu, Salary
sütunu için varsayılan değeri 100 olarak belirleyen DefaultSalary
adlı bir kısıtlama ekler.
Kısıtlama Türleri
- Primary Key: Tabloya aynı kaydın eklenmesini engeller.
- Foreign Key: Başka bir tablodaki birincil anahtara işaret eder.
- Not Null: Sütuna boş değer girilmesini engeller.
- Unique: Tablodaki her kaydı benzersiz olarak tanımlar.
- Default: Varsayılan bir değer belirler.
- Check: Bir sütuna girilebilecek değerleri sınırlar.
Daha fazla bilgi için Oracle dökümantasyonuna bakabilirsiniz.
Sütun Değiştirme
ALTER TABLE Employees
ALTER COLUMN StartingDate DATETIME NOT NULL DEFAULT (GETDATE());
Bu sorgu, Employees
tablosundaki StartingDate
sütununun veri tipini DATETIME
olarak değiştirir ve varsayılan değeri mevcut tarih yapar.
Birincil Anahtar Ekleme
ALTER TABLE Employees
ADD CONSTRAINT pk_EmployeeID PRIMARY KEY (ID);
Bu komut, Employees
tablosundaki ID
sütununu birincil anahtar (Primary Key) olarak belirler. Eğer birden fazla sütunu birincil anahtar yapmak isterseniz, parantez içinde sütun adlarını virgülle ayırarak belirtebilirsiniz. Bu durumda, bir kompozit birincil anahtar oluşturulmuş olur.
Bu anlatım, SQL’de ALTER TABLE
komutunun temel kullanımını örneklerle açıklamaktadır. Kısıtlama ve sütun değişiklikleri gibi işlemleri nasıl gerçekleştirebileceğinizi gösterir.

Bölüm 3: AND ve OR Operatörleri
Sözdizimi
SELECT * FROM tablo WHERE (koşul1) AND (koşul2);
SELECT * FROM tablo WHERE (koşul1) OR (koşul2);
Örnekler
Bir tablonuz olduğunu varsayalım:
Name | Age | City |
---|---|---|
Bob | 10 | Paris |
Mat | 20 | Berlin |
Mary | 24 | Prag |
AND ÖrneğiSELECT Name FROM tablo WHERE Age > 10 AND City = 'Prag';
Bu sorgu, yaşı 10’dan büyük ve şehri Prag olan kişilerin adlarını getirir. Sonuç olarak, sadece Mary
döner.
OR Örneği
SELECT Name FROM tablo WHERE Age = 10 OR City = 'Prag';
Bu sorgu, yaşı 10 olan veya şehri Prag olan kişilerin adlarını getirir. Sonuç olarak, Bob
ve Mary
döner.
Daha fazla bilgi için AND ve OR Operatörleri sayfasına göz atabilirsiniz.
Bölüm 4: ON DELETE CASCADE
Örnekler
ON DELETE CASCADE
Bir oda yönetim uygulamanız olduğunu ve bu uygulamanın her müşteri (kiracı) için çalıştığını varsayalım. Veritabanınızda bir müşteri tablosu ve bir oda tablosu bulunuyor. Her müşteri N odaya sahip. Bu durumda, oda tablosunda müşteri tablosuna referans veren bir yabancı anahtar (foreign key) olmalıdır:
ALTER TABLE dbo.T_Room
WITH CHECK ADD CONSTRAINT FK_T_Room_T_Client
FOREIGN KEY (RM_CLI_ID)
REFERENCES dbo.T_Client (CLI_ID);
Bir müşteri başka bir yazılıma geçtiğinde, bu müşterinin verilerini silmeniz gerekecek. Ancak:
DELETE FROM T_Client WHERE CLI_ID = x;
komutunu çalıştırdığınızda, hala odaları olan bir müşteriyi silemezsiniz ve bir yabancı anahtar ihlali alırsınız. Bu durumda, müşteriyi silmeden önce odalarını silen bir kod yazmanız gerekirdi. Gelecekte daha fazla yabancı anahtar bağımlılığı ekleneceği için uygulamanızın kodunda birçok değişiklik yapmanız gerekebilir.
Bu sorunu çözmenin daha iyi bir yolu, yabancı anahtarınıza ON DELETE CASCADE
eklemektir.
ALTER TABLE dbo.T_Room
ADD CONSTRAINT FK_T_Room_T_Client
FOREIGN KEY (RM_CLI_ID)
REFERENCES dbo.T_Client (CLI_ID)
ON DELETE CASCADE;
DELETE FROM T_Client WHERE CLI_ID = x;
komutunu çalıştırdığınızda, müşteri silindiğinde o müşteriye ait tüm odalar da otomatik olarak silinir. Bu şekilde sorunu çözmüş olursunuz ve uygulama kodunda herhangi bir değişiklik yapmanıza gerek kalmaz.
Dikkat Edilmesi Gerekenler:
Microsoft SQL-Server’da, kendisine referans veren bir tablo üzerinde ON DELETE CASCADE
tanımlaması yapılamaz. Örneğin, döngüsel bir ağaç yapısı üzerinde ON DELETE CASCADE
tanımlamaya çalışırsanız:
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id =
OBJECT_ID(N'[dbo].[FK_T_FMS_Navigation_T_FMS_Navigation]') AND parent_object_id =
OBJECT_ID(N'[dbo].[T_FMS_Navigation]'))
ALTER TABLE [dbo].[T_FMS_Navigation] WITH CHECK ADD CONSTRAINT
[FK_T_FMS_Navigation_T_FMS_Navigation] FOREIGN KEY([NA_NA_UID])
REFERENCES [dbo].[T_FMS_Navigation] ([NA_UID])
ON DELETE CASCADE;
GO
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id =
OBJECT_ID(N'[dbo].[FK_T_FMS_Navigation_T_FMS_Navigation]') AND parent_object_id =
OBJECT_ID(N'[dbo].[T_FMS_Navigation]'))
ALTER TABLE [dbo].[T_FMS_Navigation] CHECK CONSTRAINT [FK_T_FMS_Navigation_T_FMS_Navigation];
GO
Bu işlem çalışmaz çünkü Microsoft SQL Server, döngüsel bir ağaç yapısında ON DELETE CASCADE
tanımlamanıza izin vermez. Bunun nedeni, ağacın döngüsel olabilmesi ve bu durumda bir kilitlenmeye yol açabilmesidir. PostgreSQL ise bu işlemi yapabilir; ancak ağacın döngüsel olmaması gerekir. Eğer ağaç döngüsel ise, bir çalışma zamanı hatası alırsınız. Bu durumda, silme işlemini kendiniz uygulamanız gerekir.

