2011-02-16 15 views
10

başka tablonun aynı sütunda işaret edecek bir tablonun iki sütun üzerinde yabancı bir anahtar oluşturmak için çalışıyorum, ancak bir hata almak gibi yabancı anahtar ekleme</p> İşte <p>ne var ... birden çok sütun

CREATE TABLE test2 (
    ID INT NOT NULL AUTO_INCREMENT, 
    col1 INT NOT NULL, 
    col2 INT NOT NULL, 
    PRIMARY KEY (ID), 
    CONSTRAINT fk FOREIGN KEY (col1, col2) 
       REFERENCES test1(ID, ID) 
    ON UPDATE CASCADE 
    ON DELETE RESTRICT 
) ENGINE=InnoDB; 

Ama yalnızca bir sütun, ancak, masa doğru oluşturulur varsa ben

ERROR 1005 (HY000): Can't create table 'DB.test2' (errno: 150)

olsun: I do.

Birisi bana hatanın nerede olduğunu gösterebilir mi?

Teşekkür n

+0

Test1'in DDL'si nedir? – Chandu

+0

@Cybernate: Üzgünüz, belirtmeyi unuttuysanız, ID, col1 ve col2 (INT) ile aynı türde olan test1'in birincil anahtarıdır. Bir sürü başka sütun var (ama bu önemli olmamalı) VE başka hiçbir kısıtlama veya endeks belirlenmedi. – nico

+0

Basamaklı güncellemeler veya silme işlemlerini belirtmeden bunu denediniz mi? – Thomas

cevap

8

burada denedim ve aynı hata var. Bu olsa çalışır:

CREATE TABLE test2 (
    ID INT NOT NULL AUTO_INCREMENT, 
    col1 INT NOT NULL, 
    col2 INT NOT NULL, 
    PRIMARY KEY (ID), 
    CONSTRAINT fk FOREIGN KEY (col1) 
       REFERENCES test1(ID) 
    ON UPDATE CASCADE 
    ON DELETE RESTRICT, 
    CONSTRAINT fk2 FOREIGN KEY (col2) 
       REFERENCES test1(ID) 
    ON UPDATE CASCADE 
    ON DELETE RESTRICT 

) ENGINE=InnoDB 

Evet, biliyorum - senaryonuz gerektiğini eser (hatta çok mantıklı görünmüyor ise). Yine de, bu yeni versiyonun daha iyi olduğunu düşünüyorum.

+0

Peki, işe yarıyor. Niçin benimki neden olmadığından emin değilim ... – nico

+4

@nico - Aynı üst tablonun sütununda iki bağımsız ilişkiniz olduğu için işe yarıyor. Bu şekilde düşünün, yalnızca ana tablo anahtarı çok sütunlu bir anahtar olsaydı, orijinal yazdıklarınızdaki sözdizimini kullanırdınız. Üst tablo sütunu tek bir sütunsa, her alt sütun için ana tablo sütununa başvurmak isterseniz, ayrı bir yabancı anahtar kısıtlaması oluşturmanız gerekir. – Thomas

+0

@Thomas: Tamam, şimdi anlıyorum! Aslında bunun hakkında düşünmek, çok mantıklı. Teşekkür ederim. – nico

2

Sorun aynı yabancı anahtarın iki kez aynı yabancı anahtarda (yani, (ID, ID)) belirtilmesi gibi görünmektedir. Aşağıdaki çalışması gerekir:

Create Table Test1 
    (
    PK1 int not null 
    , PK2 int not null 
    , Primary Key (PK1, PK2) 
    ) 

Create Table Test2 
    (
    Id int not null Auto_Increment 
    , PK1 int not null 
    , PK2 int not null 
    , Primary Key (ID) 
    , Constraint FK_Test2 
     Foreign Key (PK1, PK2) 
     References Test1(PK1, PK2) 
    ) 

o durumda, rsenna gösterdiği gibi bu ikisini temsil gibi aynı ana tablo sütunu, o zaman iki yabancı anahtar başvuruları eklemelisiniz başvuruda bulunan bir alt tabloda iki sütun istediğiniz bağımsız ilişkiler.

+0

Peki, ancak Test1'de birleşik birincil anahtarım yok ... Test2'deki her iki sütun da Test1'deki aynı (benzersiz) birincil anahtara işaret etmelidir. – nico

+0

@nico - O zaman bunlar iki bağımsız ilişkiyi temsil eder ve iki yabancı anahtar kısıtlaması gerektirir. Ana sütun bir çok sütunlu anahtar olduğunda, yalnızca OP'inizdeki sözdizimini kullanırsınız. – Thomas