MySQL Error 1215 — Kısıt Neden Eklenmiyor?
1215 hatasında SHOW ENGINE INNODB STATUS ile gerçek nedeni okuma, tip/charset uyuşmazlığı, indeks ve motor farkları.
Operasyonel Doğrulama & Güvenilirlik Standardı
Hata mesajı semptomdur, kök neden değildir. Sunucuyu yeniden başlatmadan veya rastgele ayar değiştirmeden önce aşağıdaki "Nedeni ayırt eden tek sorgu"yu çalıştırarak gerçek senaryoyu netleştirin.
▸Belirti
ERROR 1215 (HY000): Cannot add foreign key constraintBu hata, MySQL'in en az açıklama yapan ve mühendisleri en çok çaresiz bırakan hatalarından biridir: Hangi kolonun, hangi kısıtın veya hangi kuralın ihlal edildiğini doğrudan söylemez.
Ancak harika bir haber vardır: InnoDB bu hatanın gerçek nedenini detaylıca günlüğe kaydetmiştir, sadece bunu görebilmek için doğru teşhis komutunu çalıştırmanız gerekir:
SHOW ENGINE INNODB STATUSGÇıktı içinde şu kritik başlığı arayın:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
2026-10-30 00:45:12 0x7f8 Error in foreign key constraint creation
for table `app`.`siparis_detay`:
Foreign key constraint 'fk_detay_siparis' cannot be created:
referencing column `siparis_id` (bigint unsigned) is not compatible
with referenced column `id` (int)Kısıtın neden reddedildiği bu blokta gün gibi açıktır. 1215 ile karşılaşan herkesin ilk adımı bu bölümü okumaktır.
plaintext
ERROR 3780 (HY000): Referencing column 'siparis_id' and referenced column 'id' in foreign key constraint 'fk_detay_siparis' are incompatible.
▸Nedenini Doğrulayan Teşhis Sorguları
İki kolonun özelliklerini yan yana koyup harf harf karşılaştırın:
SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE,
CHARACTER_SET_NAME, COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'app'
AND ((TABLE_NAME = 'siparis' AND COLUMN_NAME = 'id')
OR (TABLE_NAME = 'siparis_detay' AND COLUMN_NAME = 'siparis_id'));COLUMN_TYPE, CHARACTER_SET_NAME veya COLLATION_NAME alanlarındaki en küçük bir fark kısıtın reddedilmesi için yeterlidir.
▸Yabancı Anahtar Eklenmesini Engelleyen Yedi Temel Neden
- 1İşaretli / İşaretsiz (Signed vs Unsigned) Farkı:
En yaygın nedendir. Ebeveyn tablodaki birincil anahtar BIGINT UNSIGNED iken, çocuk tablodaki yabancı anahtar kolonunu BIGINT (signed) tanımlarsanız MySQL kısıtı kesinlikle reddeder. İkisi de 8 bayttır ancak veri tipleri uyumsuzdur.
- 1Karakter Seti (Charset) veya Collation Uyuşmazlığı:
Metin kolonlarında ebeveyn utf8mb4_0900_ai_ci, çocuk ise utf8mb4_general_ci ise kısıt eklenemez.
- 1Ebeveyn Kolonda İndeks Eksikliği:
Referans verilen ebeveyn kolon bir B-Tree indeksinin en solundaki (leftmost) kolonu olmak zorundadır. Bileşik bir indeksin (kategori_id, id) ikinci kolonuna referans verilemez.
- 1Mevcut Verilerde Yetim Satırlar (Orphaned Rows):
Kısıt sonradan (ALTER TABLE) ekleniyorsa ve çocuk tabloda ebeveynde karşılığı olmayan kayıtlar varsa 1215 alınır. Yetim kayıtları bulun:
SELECT c.id, c.siparis_id FROM app.siparis_detay c
LEFT JOIN app.siparis p ON p.id = c.siparis_id
WHERE p.id IS NULL LIMIT 10;- 1`ON DELETE SET NULL` + `NOT NULL` Çelişkisi:
Çocuk kolon NOT NULL tanımlanmışken kısıt kuralına ON DELETE SET NULL eklerseniz çelişki nedeniyle 1215 (veya 1830) döner.
- 1Depolama Motoru Uyuşmazlığı:
Tablolardan biri MyISAM ise kısıt eklenemez; her iki tablo da InnoDB olmalıdır.
- 1Kısıt Adı Çakışması:
MySQL'de kısıt (constraint) adları veritabanı şeması genelinde tekil olmak zorundadır. Başka bir tabloda aynı isimli FK varsa işlem reddedilir.
▸Adım Adım Kalıcı Çözüm
1. Veri Tiplerini ve Collation'ı Birebir Eşitleyin
ALTER TABLE app.siparis_detay
MODIFY siparis_id BIGINT UNSIGNED NOT NULL;2. Kısıtı Düzgün Sözdizimiyle Ekleyin
ALTER TABLE app.siparis_detay
ADD CONSTRAINT fk_detay_siparis FOREIGN KEY (siparis_id)
REFERENCES app.siparis (id) ON DELETE RESTRICT;SET FOREIGN_KEY_CHECKS = 0; komutu veritabanına saatli bomba koymaktır. Bu ayar açıldığında MySQL mevcut yetim kayıtları denetlemeyi atlar ve kısıtı zorla ekler. Ancak veritabanında tutarsız yetim satırlar kalır ve bu kayıtlar ilk DELETE veya UPDATE denemenizde anlaşılması zor hatalarla (H-38) patlar.▸İlgili Hata Rehberleri & Hub Bağlantıları
- •MySQL Error 1452 Foreign Key Constraint (H-14) — Ekleme sırasında referans eksikliği
- •MySQL Error 1451 Cannot Delete Parent Row (H-38) — Silme sırasında yabancı anahtar engeli
- •MySQL Error 1071 Specified Key Too Long (H-22) — İndeks boyutu sınırları
- •MySQL Hub — Şema tasarımı ve InnoDB mimarisi
Diğer Veritabanı Hata Teşhisleri
Kriz anında başvurabileceğiniz diğer doğrulanmış hata rehberleri.
MySQL ERROR 1045 Access denied: root Şifresi Sıfırlama Rehberi
MySQL 1045 hatasının dört nedeni, "using password: YES/NO" ayrımının anlamı ve kilitli kalınca --init-file ile güvenli şifre sıfırlama.
MySQL Deadlock ERROR 1213: Grafiği Okuma ve Kalıcı Önleme
MySQL 1213 deadlock hatasının nedeni, LATEST DETECTED DEADLOCK çıktısını okuma, gap lock kaynaklı kilitlenmeler ve uygulama tarafında retry tasarımı.
MySQL Lock wait timeout exceeded: Bloklayan İşlemi Bulma
1205 lock wait timeout hatasında bloklayan işlemi performance_schema ile bulma, KILL kararını verme ve kilidi kalıcı olarak azaltma yöntemleri.