SQL Notları: INSERT İşlemleri

## MySQL’de INSERT İşlemleri

MySQL’de `INSERT` komutu, veritabanı tablolarına yeni veri eklemek için kullanılır. Bu bölümde, `INSERT` komutunun farklı kullanım senaryolarını ve ipuçlarını inceleyeceğiz.

### 1. **Temel INSERT İşlemi**

Temel bir `INSERT` komutu, belirli bir tabloya yeni bir satır ekler. Sütun adları ve eklenen değerler belirtilir.

**Örnek Kullanım:**
“`sql
INSERT INTO `table_name` (`field_one`, `field_two`) 
VALUES (‘value_one’, ‘value_two’);
“`

Bu örnekte, `table_name` tablosuna `field_one` ve `field_two` sütunlarına sırasıyla `value_one` ve `value_two` değerleri eklenir.

### 2. **Çoklu Satır Ekleme**

Tek bir `INSERT` komutu ile birden fazla satır eklemek mümkündür. Bu, özellikle büyük veri setlerinde performansı artırır.

**Örnek Kullanım:**
“`sql
INSERT INTO `my_table` (`field_1`, `field_2`) 
VALUES 
(‘data_1’, ‘data_2’),
(‘data_1’, ‘data_3’),
(‘data_4’, ‘data_5’);
“`

Bu sorgu, `my_table` tablosuna üç yeni satır ekler. Her bir satır için `field_1` ve `field_2` sütunlarına farklı değerler atanır.

### 3. **INSERT IGNORE ile Hataları Yoksayma**

`INSERT IGNORE` komutu, eğer eklenmeye çalışılan satır bir kısıtlama ihlali (örneğin, benzersiz anahtar ihlali) nedeniyle hata alırsa, bu hatayı yoksayar ve diğer satırları eklemeye devam eder.

**Örnek Kullanım:**
“`sql
INSERT IGNORE INTO `people` (`id`, `name`) 
VALUES 
(2, ‘anna’),  — Bu satır, id=2 zaten var olduğu için yoksayılır
(3, ‘mike’);  — Bu satır eklenecektir
“`

Bu sorgu, `people` tablosuna iki yeni satır eklemeye çalışır. Eğer `id=2` zaten varsa, bu satır yoksayılır ve `id=3` eklenir.

### 4. **ON DUPLICATE KEY UPDATE ile Güncelleme**

`ON DUPLICATE KEY UPDATE` ifadesi, eğer eklenmeye çalışılan satır bir benzersiz anahtar ihlali nedeniyle hata alırsa, bu satırı günceller.

**Örnek Kullanım:**
“`sql
INSERT INTO `table_name` (`index_field`, `other_field_1`, `other_field_2`) 
VALUES 
(‘index_value’, ‘insert_value’, ‘other_value’) 
ON DUPLICATE KEY UPDATE 
`other_field_1` = ‘update_value’, 
`other_field_2` = VALUES(`other_field_2`);
“`

Bu sorgu, `table_name` tablosuna yeni bir satır eklemeye çalışır. Eğer `index_field` zaten varsa, `other_field_1` güncellenir ve `other_field_2` orijinal değerini korur.

### 5. **AUTO_INCREMENT ve LAST_INSERT_ID()**

`AUTO_INCREMENT` sütunu olan bir tabloya veri eklendiğinde, yeni eklenen satırın `AUTO_INCREMENT` değerini almak için `LAST_INSERT_ID()` fonksiyonu kullanılır.

**Örnek Kullanım:**
“`sql
CREATE TABLE t (
   id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL,
   this VARCHAR(50),
   that VARCHAR(50),
   PRIMARY KEY(id)
);

INSERT INTO t (this, that) VALUES (‘value1’, ‘value2’);
SELECT LAST_INSERT_ID() INTO @id;
INSERT INTO another_table (t_id, other_field) VALUES (@id, ‘other_value’);
“`

Bu örnekte, `t` tablosuna yeni bir satır eklenir ve `LAST_INSERT_ID()` ile yeni eklenen satırın `id` değeri alınır. Bu değer daha sonra `another_table` tablosuna eklenir.

### 6. **INSERT SELECT ile Başka Tablodan Veri Ekleme**

`INSERT SELECT` komutu, bir tablodan seçilen verileri başka bir tabloya eklemek için kullanılır.

**Örnek Kullanım:**
“`sql
INSERT INTO `tableA` (`field_one`, `field_two`) 
SELECT `tableB`.`field_one`, `tableB`.`field_two`
FROM `tableB`
WHERE `tableB`.clm <> ‘someValue’
ORDER BY `tableB`.sorting_clmn;
“`

Bu sorgu, `tableB` tablosundan seçilen verileri `tableA` tablosuna ekler. `WHERE` ve `ORDER BY` ifadeleri ile filtreleme ve sıralama yapılabilir.

### 7. **AUTO_INCREMENT ID’lerinin Kaybı**

Bazı durumlarda, `INSERT` işlemleri sırasında `AUTO_INCREMENT` değerleri “yanabilir” (kaybolabilir). Bu, özellikle `INSERT IGNORE` veya `REPLACE` gibi komutlar kullanıldığında gerçekleşebilir.

**Örnek Kullanım:**
“`sql
CREATE TABLE Burn (
   id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL,
   name VARCHAR(99) NOT NULL,
   PRIMARY KEY(id),
   UNIQUE(name)
) ENGINE=InnoDB;

INSERT IGNORE INTO Burn (name) VALUES (‘first’), (‘second’);
SELECT LAST_INSERT_ID(); — 1
SELECT * FROM Burn ORDER BY id;

INSERT IGNORE INTO Burn (name) VALUES (‘second’); — id=3 yanar
SELECT LAST_INSERT_ID(); — Hala “1”
SELECT * FROM Burn ORDER BY id;

INSERT IGNORE INTO Burn (name) VALUES (‘third’);
SELECT LAST_INSERT_ID(); — Şimdi “4”
SELECT * FROM Burn ORDER BY id; — id=3 atlandı
“`

Bu örnekte, `INSERT IGNORE` kullanıldığında bazı `AUTO_INCREMENT` değerleri kaybolur (yanar). Bu durum, özellikle büyük veri setlerinde dikkate alınmalıdır.

Bu bilgilerle, MySQL’de `INSERT` komutunun farklı kullanım senaryolarını ve ipuçlarını daha iyi anlayabilirsiniz.