MySQL’de Çoklu Yabancı Anahtar Sorununu Çözmek: Adım Adım Kılavuz

Veri tabanlarıyla çalışırken, özellikle MySQL’de, aynı ebeveyn tablosunu referans alan birden fazla yabancı anahtar uygulamanız gereken durumlarla karşılaşabilirsiniz. Bu durumlar özellikle zorlu olabilir; örneğin, bir nakliye detayları tablosunda farklı tedarikçileri ilişkilendirmeye çalışırken yaşanan sorunlar gibi. Bu yazıda, çoklu yabancı anahtarlarla ilgili yaygın bir soruyu ele alacağız, en iyi uygulamaları kapsayan yapılandırılmış bir çözüm sunacağız ve sorun giderme sürecinde size rehberlik edeceğiz.

Problem

Bir SHIPPING_DETAILS tablosuna sahip olduğunuzu düşünün; bu tablo hem nakliye tedarikçilerini (FedEx veya UPS gibi) hem de ürün taşıma tedarikçilerini (Dunder Mifflin gibi) takip etmekten sorumludur. Bu durumda, nakliye detayları içindeki birden fazla sütunun aynı ebeveyn tablosunu, yani VENDOR‘u referans alması gerekecektir. Ancak, bu sütunlar için yabancı anahtar kısıtlamaları oluşturmaya çalıştığınızda, birden fazla yabancı anahtar tanımlayamama gibi sorunlar ortaya çıkabilir.

Kullanıcılar genellikle şu hataları deneyimlemektedir:

Can't create table './<DB_NAME>/SHIPPING_GRID.frm' (errno: 150)

Bu hata genellikle, yabancı anahtar tanımında veya dahil olan veri türlerinde bir sorun olduğuna işaret eder.

Çözüm Genel Bakışı

MySQL’de birden fazla yabancı anahtar tanımlama sorununu çözmek için şu adımları izleyin:

  1. Tablo Yapısını Doğru Tanımlayın: VENDOR tablonuzun, SHIPPING_DETAILS tablosundaki yabancı anahtar sütunlarıyla uyumlu, benzersiz bir birincil anahtara sahip olduğundan emin olun.

  2. Tablo Türünü Düzgün Ayarlayın: Her iki tablonun (VENDOR ve SHIPPING_GRID) InnoDB türünde olduğundan emin olun. Bu kritik bir öneme sahiptir, çünkü yabancı anahtar kısıtlamaları diğer depolama motorlarında, örneğin MyISAM’da desteklenmez.

  3. Veri Türü Uyumluluğunu Sağlayın: Yabancı anahtarların veri türlerinin, referans aldıkları birincil anahtarın veri türüyle eşleştiğinden emin olun. Örneğin, VENDOR.no INT(6) olarak tanımlanmışsa, tüm yabancı anahtar referanslarının da aynı türde olması gerekmektedir.

  4. Tekrar Eden Birincil Anahtar Tanımlarından Kaçının: SQL ifadenizin, istemeden de olsa birincil anahtarın birden fazla tanımını içermediğinden emin olun. Bu, tablo oluşturma sırasında hatalara yol açabilir.

Örnek Kod

Yukarıdaki noktaları dikkate alarak, SHIPPING_GRID tablonuzun düzgün bir şekilde nasıl tanımlanabileceğine dair düzeltilmiş bir örnek:

CREATE TABLE SHIPPING_GRID(  
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT 'Her satır için benzersiz kimlik',
    shipping_vendor_no INT(6) NOT NULL COMMENT 'Nakliye tedarikçisi için VENDOR.no üzerindeki yabancı anahtar (vendors_type 3 olmalı)',
    start_vendor_no INT(6) NOT NULL COMMENT 'Gönderim yapılan tedarikçi için VENDOR.no üzerindeki yabancı anahtar',
    end_vendor_no INT(6) NOT NULL COMMENT 'Gönderim yapılan yere ait tedarikçi için VENDOR.no üzerindeki yabancı anahtar',
    shipment_duration INT(1) DEFAULT 1 COMMENT 'Gönderimin alacağı tam gün sayısı',
    price FLOAT(5,5) NOT NULL COMMENT 'Gönderim başına pound için ABD Doları cinsinden fiyat (5 ondalık hanelere kadar)',
    is_flat_rate TINYINT(1) DEFAULT 0 COMMENT 'Ağırlıktan bağımsız olarak sabit ücretse 1, pound başına ücretse 0',
    INDEX (shipping_vendor_no),
    INDEX (start_vendor_no),
    INDEX (end_vendor_no),
    FOREIGN KEY (shipping_vendor_no) REFERENCES VENDOR (no),
    FOREIGN KEY (start_vendor_no) REFERENCES VENDOR (no),
    FOREIGN KEY (end_vendor_no) REFERENCES VENDOR (no)  
) ENGINE=InnoDB;

Anahtar Noktalar

  • Veri Türleri Önemlidir: Yabancı anahtar sütunlarının, referans aldıkları birincil anahtarın veri türüyle eşleştiğinden her zaman emin olun.
  • InnoDB Kullanın: Tablolar arasında yabancı anahtarlar kuruyorsanız, InnoDB motorunu kullanmanız esastır.
  • Tekrarları Önleyin: SQL’iniz hata üretiyorsa, tekrar eden tanımlar veya sözdizimi sorunları için iki kez kontrol edin.

Bu yönergeleri izleyerek, çoklu yabancı anahtarlarla tablonuzu etkili bir şekilde oluşturabilir ve yabancı anahtar kısıtlamalarıyla ilgili yaygın hatalardan kaçınabilirsiniz. MySQL serüvenlerinizde başarılar dileriz, bol kodlama keyfi!