### MySQL'de ENUM Veri Türü
MySQL'de `ENUM`, bir sütuna belirli bir değer kümesinden değerler atamak için kullanılan bir veri türüdür. Bu yazıda, `ENUM` veri türünün avantajlarını, alternatiflerini ve nasıl kullanılacağını ele alacağız.
#### 1. ENUM Nedir ve Neden Kullanılır?
`ENUM`, bir satır için belirli bir özellik (attribute) tanımlamak için kullanılır. Özellikle az sayıda ve sayısal olmayan seçenekler için idealdir.
##### Örnek: ENUM Kullanımı
```sql
CREATE TABLE example (
reply ENUM('yes', 'no'),
gender ENUM('male', 'female', 'other', 'decline-to-state')
);
```
Bu örnekte, `reply` sütunu sadece `'yes'` veya `'no'` değerlerini alabilirken, `gender` sütunu `'male'`, `'female'`, `'other'` veya `'decline-to-state'` değerlerini alabilir.
##### Veri Ekleme ve Sorgulama
```sql
INSERT INTO example (reply, gender) VALUES ('yes', 'female');
SELECT * FROM example;
```
**Sonuç:**
```
+---+---+
| reply | gender |
+---+---+
| yes | female |
+---+---+
```
#### 2. VARCHAR Alternatifi
`ENUM` yerine `VARCHAR` kullanmak da bir seçenektir, ancak bu durumda bazı avantajlar ve dezavantajlar ortaya çıkar.
##### Örnek: VARCHAR Kullanımı
```sql
CREATE TABLE example (
type VARCHAR(20) COMMENT "fish, bird, etc"
);
```
**Karşılaştırma:**
- **INSERT:** Her iki durumda da değerler doğrudan eklenir.
- **SELECT:** Her iki durumda da gerçek değerler döndürülür.
- **Dezavantaj:** `VARCHAR` kullanıldığında, yanlış yazımlar (typo) fark edilmeyebilir ve daha fazla depolama alanı tüketilir.
#### 3. Yeni Seçenek Ekleme
`ENUM` sütununa yeni bir seçenek eklemek için `ALTER TABLE` komutu kullanılır.
##### Örnek: Yeni Seçenek Ekleme
```sql
ALTER TABLE example MODIFY COLUMN type ENUM('fish', 'mammal', 'bird', 'insect');
```
**Not:**
- `MODIFY COLUMN` kullanırken, `NOT NULL` gibi diğer nitelikleri de yeniden belirtmek gerekir, aksi takdirde kaybolurlar.
- Liste 256'dan az öğe içeriyorsa ve yeni seçenek listenin sonuna ekleniyorsa, `ALTER` işlemi hızlı bir şekilde gerçekleşir.
#### 4. NULL vs NOT NULL
`ENUM` sütunları `NULL` veya `NOT NULL` olarak tanımlanabilir. `NULL` değerler, sütunun boş bırakılabileceği anlamına gelir.
##### Örnek: NULL ve NOT NULL Karşılaştırması
```sql
CREATE TABLE enum_example (
e ENUM('yes', 'no') NOT NULL,
enull ENUM('x', 'y', 'z') NULL
);
INSERT INTO enum_example (e, enull)
VALUES
('yes', 'x'),
('no', 'y'),
(NULL, NULL),
('bad-value', 'bad-value');
```
**Uyarılar:**
```
+---+---+
| Level | Code | Message |
+---+---+
| Warning | 1048 | Column 'e' cannot be null |
| Warning | 1265 | Data truncated for column 'e' at row 4 |
| Warning | 1265 | Data truncated for column 'enull' at row 4 |
+---+---+
```
**Sorgu Sonuçları:**
```sql
SELECT e, e+0 FROM enum_example;
```
**Sonuç:**
```
+---+---+
| e | e+0 |
+---+---+
| yes | 1 |
| no | 2 |
| | 0 | -- NULL |
| | 0 | -- 'bad-value' |
+---+---+
```
```sql
SELECT enull, enull+0 FROM enum_example;
```
**Sonuç:**
```
+---+---+
| enull | enull+0 |
+---+---+
| x | 1 |
| y | 2 |
| NULL | NULL |
| | 0 | -- 'bad-value' |
+---+---+
```
#### Sonuç
`ENUM` veri türü, belirli bir değer kümesi içeren sütunlar için kullanışlıdır. Ancak, `VARCHAR` gibi alternatifler de düşünülmeli ve ihtiyaçlara göre en uygun seçenek belirlenmelidir. `ENUM` kullanırken, `NULL` ve `NOT NULL` durumlarına dikkat edilmeli ve yeni seçenekler eklenirken `ALTER TABLE` komutu kullanılmalıdır. Bir sonraki yazıda görüşmek üzere!