2009-11-29 29 views
8

3 diğer tabloya başvurmak üzere MySQL 5.1 sürümünde bir tablo oluşturmak için aşağıdaki komut dosyasına sahibim. Tüm 3 tablo InnoDB kullanılarak oluşturulmuştur ve 3 tablonun tümü INT olarak tanımlanan ID sütununa sahiptir.Yabancı Anahtarlar ve MySQL Hataları

ACCOUNT ve PERSON'a referans veren diğer tabloları başarılı bir şekilde oluşturdum, ancak ADDRESS'e başvuran ilk tablo budur, bu nedenle, bu tablo için tanımlamayı aşağıdaki gibi de dahil ettim.

Elde ettiğim hata, ERROR 1005 (HY000) hatasıdır, bu da yabancı anahtar oluşturma ile ilgili olduğunu anladığım errno 150 ile.

başarısız komut dosyası (basitlik için kaldırılmıştır ekstra sütunlar) 'dir:

CREATE TABLE WORK_ORDER (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    ACCOUNT_ID INT NOT NULL, 
    CUSTOMER_ID INT NOT NULL, 
    SALES_ID INT, 
    TRADES_ID INT, 
    LOCATION_ID INT NOT NULL, 
    INDEX CUST_INDEX(CUSTOMER_ID), 
    INDEX SALES_INDEX(SALES_ID), 
    INDEX TRADES_INDEX(TRADES_ID), 
    INDEX ACCOUNT_INDEX(ACCOUNT_ID), 
    INDEX LOCATION_INDEX(LOCATION_ID), 
    FOREIGN KEY (CUSTOMER_ID) REFERENCES PERSON(ID) ON DELETE CASCADE, 
    FOREIGN KEY (SALES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL, 
    FOREIGN KEY (TRADES_ID) REFERENCES PERSON(ID) ON DELETE SET NULL, 
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE, 
    FOREIGN KEY (LOCATION_ID) REFERENCES ADDRESS(ID) ON DELETE SET NULL 
) ENGINE=InnoDB; 

ADRES tablo oluşturmak için kullanılan SQL deyimi (ekstra sütunlar basitlik için kaldırılmıştır) altındadır.

CREATE TABLE ADDRESS (
    ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    PERSON_ID INT NOT NULL, 
    ACCOUNT_ID INT NOT NULL, 
    ADDRESS_L1 VARCHAR(50), 
    ADDRESS_L2 VARCHAR(50), 
    CITY VARCHAR(25), 
    PROVINCE VARCHAR(20), 
    POSTAL_CODE VARCHAR(6), 
    COUNTRY VARCHAR(25), 
    INDEX CUST_INDEX(PERSON_ID), 
    INDEX ACCOUNT_INDEX(ACCOUNT_ID), 
    FOREIGN KEY (ACCOUNT_ID) REFERENCES ACCOUNT(ID) ON DELETE CASCADE, 
    FOREIGN KEY (PERSON_ID) REFERENCES PERSON(ID) ON DELETE CASCADE 
) ENGINE=InnoDB; 

Burada benzer sorunlarla uğraşan çeşitli sorularla göz attıktan ama çoğu yinelenen tanımlar ve eşleşmeyen alan türleri yanı sıra biri için bazı kullanmayan InnoDB'nin veya tablolar diğer görünmektedir. Ancak, bunların hiçbiri problem gibi görünmüyor. Herhangi bir fikir?

+2

location_id tuş üzerinde Kişisel SİL eylem pek doğru görünmüyor: çıktıda Gömülü '150' hataya neden tam olarak ne üzerinde daha fazla ayrıntı olacaktır bir "SON YABANCI KEY HATA" bölümü olacak LOCATION_ID, NULL DEĞİL olarak tanımlandı. Ben mysql bu kısıtlama oluşturma sırasında kontrol etmedi düşünmüyordu, ancak ... – grossvogel

+0

Teşekkürler, işe yaradı! Bir cevap olarak gönderin ve doğru olarak işaretleyeceğim. – Elie

cevap

13

Her zaman 'SHOW ENGINE INNODB STATUS' komutunu verebilirsiniz. ,

mysql> create table a (x int not null) type=innodb; 
Query OK, 0 rows affected, 1 warning (0.02 sec) 

mysql> create table b (y int not null, foreign key (y) references a (x) on delete set null) type=innodb; 
ERROR 1005 (HY000): Can't create table './test/b.frm' (errno: 150) 

mysql> show engine innodb status; 
[..... snip snip snip ...] 
------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
091129 16:32:41 Error in foreign key constraint of table test/b: 
foreign key (y) references a (x) on delete set null) type=innodb: 
You have defined a SET NULL condition though some of the 
columns are defined as NOT NULL. 
[.... snip snip snip ...] 
+0

Serin, her gün yeni bir şeyler öğrenin (sanırım bu, günün geri kalanı için öğrenmek için kanca kapalı olduğum anlamına gelir). – Elie

İlgili konular