Yanıtlar:
Evet, ama sadece innodb. Innodb şu anda yabancı anahtarların uygulandığı tek gönderilen tablo biçimidir.
Görünüşe göre robert'in gönderdiği bağlantıda belirtildiği gibi otomatik olarak bir dizin oluşturulur .
InnoDB, yabancı anahtar denetimlerinin hızlı olması ve tablo taraması gerektirmemesi için yabancı anahtarlarda ve başvurulan anahtarlarda dizinler gerektirir. Referans tablosunda, yabancı anahtar sütunlarının aynı sırada ilk sütun olarak listelendiği bir dizin olmalıdır. Böyle bir indeks, mevcut değilse referans tablosunda otomatik olarak oluşturulur. (Bu, dizinlerin açıkça oluşturulması gereken veya yabancı anahtar kısıtlamalarının oluşturulmasının başarısız olacağı bazı eski sürümlerin tersidir.) Verilmişse, dizin_adı daha önce açıklandığı gibi kullanılır.
InnoDB permits a foreign key to reference any index column or group of columns. However, in the referenced table, there must be an index where the referenced columns are the first columns in the same order.
Evet, bkz. InnoDB ve FOREIGN KEY Kısıtlamaları .
En azından dokümanlara göre bir ALTER TABLE (CREATE TABLE yerine) yaparsanız dizini otomatik olarak almazsınız (bağlantı 5.1 içindir, ancak 5.5 için aynıdır):
[...] ALTER TABLE kullanarak bir tabloya yabancı anahtar kısıtlaması eklediğinizde, önce gerekli dizinleri oluşturmayı unutmayın.
5.7
Dokümanlardan teklif almak isteyenler için :
MySQL, yabancı anahtarlar ve başvurulan anahtarlar için dizinler gerektirir, böylece yabancı anahtar denetimleri hızlı olabilir ve tablo taraması gerektirmez. Referans tablosunda, yabancı anahtar sütunlarının aynı sırada ilk sütun olarak listelendiği bir dizin olmalıdır. Böyle bir indeks, mevcut değilse referans tablosunda otomatik olarak oluşturulur. Yabancı anahtar kısıtlamasını uygulamak için kullanılabilecek başka bir dizin oluşturursanız, bu dizin daha sonra sessizce bırakılabilir. Dizin_adı, belirtilmişse, daha önce açıklandığı gibi kullanılır.
Belirtildiği gibi InnoDB için yapar. İlk başta diğerlerinin (özellikle MS SQL ve DB2) yapmamasının garip olduğunu düşündüm. TableSpace taramaları, çok az sayıda tablo satırı olduğunda dizin taramalarından daha iyidir - bu nedenle, vakaların büyük çoğunluğu için yabancı bir anahtarın dizine alınması istenir. O zaman bu beni vurdu - bu mutlaka tek başına (bir sütun) endeksi olması gerektiği anlamına gelmez - burada MySQL'in otomatik FK Endeksi'nde. Yani, MS SQL, DB2 (Oracle emin değilim) vb DBA kadar bırakmak nedeni bu olabilir; büyük tablolardaki tüm birden çok dizin, performans ve alanla ilgili sorunlara neden olabilir.
Evet, Innodb
sağlayın. FOREIGN KEY
Maddeden sonra bir yabancı anahtar adı koyabilir veya MySQL'in sizin için bir ad oluşturmasına izin vermek için bırakabilirsiniz. MySQL otomatik olarak foreign_key_name
adıyla bir dizin oluşturur .
CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action