SQL Notları: ENUM Veri Türü

### 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!