PhpMyAdmin'de yabancı anahtarlar ayarlanıyor mu?


336

Ben phpMyAdmin kullanarak bir veritabanı kuruyorum. Birincil anahtarları dizine iki tablo ( foove bar) var . Birincil anahtarları yabancı anahtar olarak kullanarak aralarında ilişkisel bir tablo ( ) oluşturmaya çalışıyorum .foo_bar

Bu tabloları MyISAM olarak oluşturdum, ancak o zamandan beri üçünü de InnoDB olarak değiştirdim, çünkü MyISAM'in yabancı anahtarları desteklemediğini okudum. Tüm idalanlar INT(11).

Ben seçtiğinizde foo_bartablo, "ilişki görünümü" bağlantısını tıklayın ve FK sütunlar olarak ayarlanır denemek database.foo.idve database.bar.iddiyor, "Hayır indeks tanımlı!" her sütunun yanında.

Neyi kaçırıyorum?

Açıklama / Güncelleme

Sadelik için phpMyAdmin kullanmaya devam etmek istiyorum. Şu anda bana PHP / CSS / Javascript odaklanmak izin kolay XAMPP kullanıyorum ve phpMyAdmin ile geliyor.

Ayrıca, henüz açık yabancı anahtarlar ayarlayamadım, ancak ilişkisel bir tablo var ve böyle birleşimler gerçekleştirebilirsiniz:

SELECT * 
FROM foo 
INNER JOIN foo_bar 
ON foo.id = foo_bar.foo_id 
INNER JOIN bar
ON foo_bar.bar_id = bar.id;

Sadece FK'ların veritabanında açıkça tanımlanmaması beni rahatsız ediyor.

Yanıtlar:


366

İlişkileri ayarlamak için phpMyAdmin kullanmak istiyorsanız, 2 şey yapmanız gerekir. Her şeyden önce, başvuru tablosundaki yabancı anahtar sütununda bir dizin tanımlamanız gerekir (yani, foo_bar.foo_id, sizin durumunuzda). Ardından, ilişki görünümüne (başvuru tablosunda) gidin ve başvurulan sütunu (bu durumda foo.id durumunda) ve güncelleme ve silme işlemlerini seçin.

Birbirine bağlı birden çok tablonuz varsa yabancı anahtarların yararlı olduğunu düşünüyorum, özellikle referans seçeneklerini doğru ayarlarsanız silme komut dosyalarınız çok kısa olacaktır.

EDIT: Her iki tablonun da InnoDB motorunun seçili olduğundan emin olun.


93
İpucu: İlişkiler görünümü
masanızın

14
Bu bağlantı orada görünmüyorsa, bu durumda: Bunun gerçekleşmemesi için tablonuzun InnoDB türünde olduğundan emin olun (phpMyAdmin'deki İşlemler sekmesi altında).
muttley91

4
Tablom InnoDB. İki kez kontrol ettim. Bağlantı hala görünmüyor.
afilina

6
@afilina phpMyAdmin'in yeni sürümünde, "Yapı" sekmesinin üst kısmında, "Gözat", "Yapı" vb. gösteren sekme satırının hemen altında görünür.
Astitva Srivastava

226

phpMyAdmin yabancı anahtarları "ilişkiler" görünümünü kullanarak tanımlamanızı sağlar. Ancak, MySQL yalnızca "INNO DB" tablolarındaki yabancı kısıtlamaları desteklediğinden, ilk adım kullandığınız tabloların bu türde olduğundan emin olmaktır.

CHILD adlı bir tablodaki PID sütunu, PARENT adlı bir tablodaki kimlik sütununa başvurulacak şekilde bir yabancı anahtar ayarlamak için aşağıdakileri yapabilirsiniz:

  1. Her iki tablo için de işlemler sekmesine gidin ve türlerini "INNO DB" olarak değiştirin
  2. KİMLİK, PARENT tablosunun birincil anahtarı (veya en azından dizine eklenen bir sütun) olduğundan emin olun.
  3. ÇOCUK tablosunda, PID sütunu için bir dizin tanımlayın.
  4. ÇOCUK tablosunun yapı sekmesini görüntülerken, "alan ekle" bölümünün hemen üzerindeki "ilişki görünümü" bağlantısını tıklayın.
  5. Her satırın MÜŞTERİ tablonuzdaki dizine eklenmiş bir sütuna karşılık geldiği bir tablo verilecektir. Her satırdaki ilk açılır menü, hangi TABLE-> COLUMN dizinli sütun referanslarını seçmenizi sağlar. PID satırında, açılır menüden PARENT-> ID'yi seçin ve GO düğmesine tıklayın.

ÇOCUK tablosunda dışa aktarma yaparak, PID sütunu için bir yabancı anahtar kısıtlaması oluşturulduğunu görmelisiniz.


2
Vay, bilmek çok önemli bir şey. Bu sayfa, yabancı bir anahtar eklemeyle ilgili yardım ararken bulduğum ilk şey değildi, keşke daha sık bahsedilseydi.
user1299656

87

Bu bir Wikipedia makalesinin özeti. PHPmyadmin'de şart koşabileceğiniz farklı ilişki türlerini belirtir. Buraya koyuyorum çünkü @ Nathan'ın "güncelleme / silme" için yabancı anahtar seçeneklerini ayarlama hakkındaki yorumuyla ilgili ama bir yorum için çok büyük - umarım yardımcı olur.

ÇAĞLAYAN

Ana tablodaki (başvurulan) satırlar her silindiğinde (sırasıyla güncellenir), eşleşen bir yabancı anahtar sütununa sahip alt tabloya (referans) ilişkin satırlar da silinir (güncellenir). Buna basamaklı silme denir (sırasıyla güncelleme [2]).

SINIRLAMADIKLARI

Başvurulan tablodaki değere başvuran yabancı anahtar tablosunda bir satır olduğunda bir değer güncellenemez veya silinemez. Benzer şekilde, bir satır yabancı anahtar tablosundan referans alındığı sürece silinemez.

HİÇBİR EYLEM

HİÇBİR EYLEM ve KISITLAMA çok benzerdir. EYLEM YOK ve KISITLAMA arasındaki temel fark, EYLEM YOK ile tabloyu değiştirmeye çalıştıktan sonra referans bütünlük kontrolünün yapılmasıdır. RESTRICT, UPDATE veya DELETE deyimini yürütmeye çalışmadan önce denetimi yapar. Başvuru bütünlüğü denetimi başarısız olursa, her iki başvuru eylemi de aynı şekilde davranır: UPDATE veya DELETE deyimi hataya neden olur.

NULL AYARLA

Başvuru satırındaki yabancı anahtar değerleri, başvurulan satır güncellendiğinde veya silindiğinde NULL olarak ayarlanır. Bu, yalnızca referans tablosundaki ilgili sütunlar boş bırakılabilirse mümkündür. NULL anlambilimi nedeniyle, yabancı anahtar sütunlarında NULL bulunan bir başvuru satırı başvurulan bir satır gerektirmez.

VARSAYILANA AYARLA

SET NULL'a benzer şekilde, başvuru satırındaki yabancı anahtar değerleri, başvurulan satır güncellendiğinde veya silindiğinde varsayılan sütun olarak ayarlanır.


1
Daha da iyisi, doğrudan MySQL kaynak belgelerine gidin: dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
kmoser

63

Phpmyadmin içinde, Yabancı anahtarı basitçe GUI'si ile atayabilirsiniz. Tabloya tıklayın ve Yapı sekmesine gidin. tablonun hemen altında İlişki Görünümü'nü bulun (aşağıdaki resimde gösterilmiştir).

resim açıklamasını buraya girin

Dövme anahtarı birincil anahtarın yanındaki liste kutusundan atayabilirsiniz (aşağıdaki resme bakın). ve kaydet

resim açıklamasını buraya girin

karşılık gelen SQL sorgusu otomatik olarak oluşturulur ve yürütülür.


17

Veritabanına yeni olanlar için .... ve var olan bir tablo ALTER gerekir. Birçok şey oldukça basit görünüyor, ama her zaman bir şey var ... A ve B arasında.

Her şeyden önce, bir göz atın bu .

  1. P_ID'ye (hem üst hem de alt tabloda üst kimlik) sahip olduğunuzdan emin olun.
  2. Tabii ki ebeveynte zaten dolu olacak. Çocuğun gerçek ve nihai bir şekilde olması gerekmez. Örneğin, P_ID # 3 (belki alt tabloda birçok kez üst tabloda orijinal P_ID'ye işaret ediyor olabilir).
  3. SQL sekmesine gidin (phpMyAdmin kullanıyorum, diğerlerinde benzer olmalı) ve bu komutu yapın:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. Son olarak ilişkisel görünümde yapıdan ziyade alt tabloya tıklayın. DB planınızı orada tamamlayın. Bundan önce basamaklı, kısıtlı, vb. Hakkında güzel bir cevap vardı. Tabii ki komutlarla yapılabilirdi ...


9

Yabancı anahtar, tablonun asal olmayan bir özniteliğinin phpMyAdmin içindeki başka bir * öğesinin asal niteliğini ifade ettiği anlamına gelir * ilk önce yabancı anahtarını dizin olarak ayarlamak istediğiniz sütunu ayarladığı

sonra İLİŞKİ GÖRÜNÜMÜ tıklayın

orada yabancı anahtar ayarlamak için seçenekler bulabilirsiniz


7

InnoDB, ALTER TABLE kullanarak bir tabloya yeni bir yabancı anahtar kısıtlaması eklemenize izin verir:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

Öte yandan, MyISAM'in bağlamınızda InnoDB'ye göre avantajları varsa, neden yabancı anahtar kısıtlamaları oluşturmak istersiniz? Bunu uygulamanızın model düzeyinde kullanabilirsiniz. Yabancı anahtar olarak kullanmak istediğiniz sütunların dizine eklendiğinden emin olun!


4
Yabancı anahtar kısıtlamaları bana çok fazla çaba ve olası hatalar kazandırıyor. Diyelim ki bir kullanıcıyı sistemimden sileceğim. Bu kullanıcı hakkındaki verilerin bulunduğu veritabanındaki her yeri belirten bir kod yazabilir ve silmesini söyleyebilirim. Ancak bu silme işlevini her zaman güncel tutmam gerekiyor. Öte yandan, kullanıcıyla ilgili tüm verilerin kullanıcı kimliğine sahip bir FK'si varsa ve silme işlemine kademeli olarak ayarlanmışsa, tüm kodumun "bu kullanıcıyı sil" olduğunu ve veritabanının sahip olduğu her şeyi silmeyle ilgileneceğini o kullanıcıya bir FK referansı. Bakımı çok daha temiz.
Nathan Long

1
@Nathan: Postada söylediğim şey bu. Bunu model düzeyinde de halledebilirsiniz. Modelden kademeli silme işlemi uygulayabilirsiniz.
markus

3
Neredeyse her zaman veritabanı tablolarınıza bilgi bütünlüğü eklersiniz. Veritabanı kendini kötü uygulama programlamasından korumalıdır. Veri bütünlüğünü korumak için yalnızca uygulamanıza güvenmeyin. Elbette her kuralın istisnaları vardır, ancak bunun için bir kural bulamadım.
Harv

4

İki sütunun aynı veri türüne sahip olması gerektiğini unutmayın.

örneğin bir sütun INT, diğeri tinyint türündeyse aşağıdaki hatayı alırsınız:

[PID sütunu] üzerinde yabancı anahtar oluşturma hatası (veri türlerini kontrol edin)


3

Adım 1: Satırı eklemeniz gerekir: default-storage-engine = InnoDB, mysql yapılandırma dosyanızın [mysqld] bölümünün altında (işletim sisteminize bağlı olarak my.cnf veya my.ini) ve mysqld hizmetini yeniden başlatın. resim açıklamasını buraya girin

Adım 2: Şimdi tablo oluşturduğunuzda tablo türünü göreceksiniz: InnoDB

resim açıklamasını buraya girin

Adım 3: Hem Üst hem de Alt tablo oluşturun. Şimdi Alt tabloyu açın ve Yabancı Anahtarın olmasını istediğiniz U sütununu seçin: Aşağıda gösterildiği gibi Eylem Etiketi'nden Dizin Anahtarını seçin.

resim açıklamasını buraya girin

Adım 4: Şimdi İlişki Görünümü'nü aşağıda gösterildiği gibi Baskı Görünümü'nün yakınındaki alttan aynı alt tabloda açın.

resim açıklamasını buraya girin Adım 5: Açılır listeden Ana sütunu seç olarak Yabancı anahtarının olmasını istediğiniz U sütununu seçin. dbName.TableName.ColumnName

ON DELETE ve ON UPDATE için uygun Değerleri seçin resim açıklamasını buraya girin


2

İlk önce Depolama Motorunu InnoDB olarak ayarlayın

İlk önce Depolama Motorunu InnoDB olarak ayarlayın

daha sonra ilişki görünümü seçeneği yapı menüsünde etkinleştirilir

sonra ilişki görüntüleme seçeneği etkin


ilk adımınız doğrudur, ancak bir sonraki adım lütfen tüm süreci adım adım yazınız.
kunal shaktawat

2

Bu eski iş parçacığı ama cevap çünkü herkes için yararlı.

Adım 1 . Db Depolama Motorunuz InnoDB olarak ayarlandı

2. Adım . Birincil Tablo Oluştur

burada customerbirincil tablo ve customer_idbirincil anahtar

resim açıklamasını buraya girin

Adım 3 . yabancı anahtar tablosu oluşturma ve indeks verme

burada customer_addressesilgili tablo ve mağaza müşteri adresleri var, bu yüzden burada tablo customer_idile ilişkisicustomer

aşağıdaki gibi tablo oluştururken doğrudan dizin seçebiliriz

resim açıklamasını buraya girin

Bir tablo oluştururken dizin vermeyi unuttuysanız , aşağıdaki gibi tablonun yapı sekmesinden dizin verebilirsiniz .

resim açıklamasını buraya girin

4. Adım . Dizin alana verdikten sonra, yapı sekmesine gidin ve aşağıdaki resimde gösterildiği gibi İlişki Görünümü'ne tıklayın

resim açıklamasını buraya girin

Adım 5 . Şimdi pic ve aşağıda gösterildiği gibi, şimdiki tablodan, Seç sütun yapmak DB (AYNI DB) seçeneğini ilişki tablosu ve bu tablodaki birincil anahtar seçmek istediğinizi AÇIK SİL seçin ve ON UPDATE Kaydet o

resim açıklamasını buraya girin

Şimdi ilişkinin başarılı bir şekilde verilip verilmediğini kontrol edin, yabancı tablo veri listesine gidin ve yabancı anahtar değerine tıklayın, birincil tablo kaydına yeniden yönlendireceksiniz, sonra ilişki başarıyla yapıldı.



0

PhpMyAdmin'in yeni sürümlerinde artık " İlişki Görünümü " seçeneği yoktur, bu durumda aynı şeyi elde etmek için bir ifade yürütmeniz gerekir. Örneğin

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

Bu örnekte, şirketlerden bir satır silinirse, o şirket kimliğine sahip tüm çalışanlar da silinir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.