2013-07-03 13 views
10

ile çoktan çoğa ilişkisi MySQL veritabanımda çoktan çoğa bir ilişki oluşturmaya çalışıyorum. Üç tablom var: Films, Genres ve Films_Genres. Onları kurmak için aşağıdaki kodu kullanıyorum:MySQL FOREIGN KEYS

CREATE TABLE Films 
( 
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    Title VARCHAR(255) 
), 

CREATE TABLE Genres 
( 
    id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(id), 
    Name VARCHAR(255) 
), 

CREATE TABLE Films_Genres 
(
    film_id INT NOT NULL, 
    genre_id INT NOT NULL, 
    PRIMARY KEY (film_id, genre_id), 
    FOREIGN KEY (film_id) REFERENCES Films(id) ON UPDATE CASCADE, 
    FOREIGN KEY (genre_id) REFERENCES Genres(id) ON UPDATE CASCADE 
) 

Ancak, birlikte tablolar halinde bazı değerleri eklemeye çalıştığınızda: Ben Films tabloda yeni Film görebilirsiniz

INSERT INTO Films (Title) VALUES ('$title') 
INSERT INTO Genres (Name) VALUES ('$genre') 

ve Genres tablosundaki yeni Tür, ancak Films_Genres tablosu güncellenmiyor - yeni satır yok (phpMyAdmin'i kontrol ediyorum).

Neyi yanlış yapıyorum?

+0

PHP kodunu yapıştırın veya yardımcı olamayız. "$ Title" ve "$ tür" var mı doğruladınız? Vb .. –

+0

Filmlerden ve Türlerden sonuçları gösterebilirim - çalışırlar. Tek sorun, Films_Genres tablosunun herhangi bir satır eklememesidir. PHP iyi görünüyor. SQL kodunu çalıştırmak için mysqli_query ($ con, $ sql) kullanıyorum. SQL doğru mu? – Sharkz

+0

Yani 'Films_Genres' eksik bağlantı endişe endişenizdir. Bu durumda, bu iki kaydı kendiniz ilişkilendirmeniz gerekir. –

cevap

15

Films_Genres tablosunda, bir şeye açıkça bir şey ekleyene kadar hiçbir şey göremezsiniz. PK ve FK aracılığıyla referans bütünlüğü, tablolarınızı sizin için doldurmak için değildir.

yeni bir türe tekabül yeni bir film ise, bir autoincremented için yeni atanan id almak php tarafında

INSERT INTO Films (Title) VALUES ('Title1'); 
SET @film_id = LAST_INSERT_ID(); 

INSERT INTO Genres (Name) VALUES ('Genre1'); 
SET @genre_id = LAST_INSERT_ID(); 

INSERT INTO Films_Genres (film_id, genre_id) VALUES(@film_id, @genre_id); 

gibi görünebilir, Films_Genres yeni kayıt ekleme İçin MySQL kodu alan kullanımı $mysqli->insert_id.

Şimdi yeni bir film oluşturmak ve burada

INSERT INTO Films (Title) VALUES ('Title2'); 
SET @film_id = LAST_INSERT_ID(); 
-- if you get ids of genre from your UI just use them 
INSERT INTO Films_Genres (film_id, genre_id) 
SELECT @film_id, id 
    FROM Genres 
WHERE id IN (2, 3, 4); 

INSERT INTO Films (Title) VALUES ('Title3'); 
SET @film_id = LAST_INSERT_ID(); 
-- if you names of genres you can use them too 
INSERT INTO Films_Genres (film_id, genre_id) 
SELECT @film_id, id 
    FROM Genres 
WHERE Name IN ('Genre2', 'Genre4'); 

yapabilirsiniz kerede birden fazla türler atamak isterseniz bir satır eklemek gerekir, demo SQLFiddle Temelde

+0

Vay! Daha iyi bir anwser bekleyemedim! Çok teşekkürler! Ben stackoverflow seviyorum: D – Sharkz

+0

@Sharkz Hoş Geldiniz :) Ek bilgi için güncellenmiş cevap bakın. – peterm

0

olduğunu Ayrıca bir film ve bir takma adı 'link' için bağlantı tablosu da.Mysql motoru sizin için otomatik olarak yapmaz (sadece bu 2 kaydın bir şekilde ilişkili olduğunu bilmez) - bu Uygulama tarafında veya manuel olarak yapılmalıdır

INSERT INTO Films_Genres (film_id,genre_id) VALUES (1,1) 
0

Çoktan çoğa tabloyu kendiniz doldurmanız gerekiyor, mysql bu şekilde çalışıyor, maalesef burada otomatik bir tahmin çalışması yapılmıyor.