2012-08-14 101 views
2

我試圖創建兩個表與一對多的關係。下面是他們兩人的模式:爲什麼我無法在此列上創建外鍵?

CREATE TABLE property_key (
    id INTEGER AUTO_INCREMENT PRIMARY KEY, 
    property VARCHAR(4000) 
); 

CREATE TABLE property_value (
    id INTEGER AUTO_INCREMENT PRIMARY KEY, 
    prop_key VARCHAR(4000), 
    prop_value VARCHAR(4000), 
    lang VARCHAR(2), 
    INDEX ix_land(lang) 
); 

當我試圖在prop_keyproperty_valueproperty_key之間添加一個外鍵關係,我得到一個奇怪的錯誤:

[ALTER - 0 row(s), 0.000 secs] [Error Code: 1005, SQL State: HY000] 
Can't create table 'test.#sql-a8_6' (errno: 150) 

的ALTER語法我中號使用的是:

ALTER TABLE property_value ADD CONSTRAINT fk_prop_key FOREIGN KEY (prop_key) REFERENCES property_key(property); 

我已經就此事諮詢了MySQL Reference Manual,但我已經滿足所有的需求療法即我如何緩解這個問題?

+2

4000個字符主鍵?讓人驚訝。 – 2012-08-14 23:26:40

回答

3

一個問題是字段太大。 InnoDB has a field limit of 768 bytes per key,並且正在創建的外鍵大約爲8KB。此外,不可能確保外鍵是唯一的。

緩解這一問題的兩個選項 - 您可以將VARCHAR字段的大小減小到小於768字節,也可以使用兩個id字段的索引。

ALTER TABLE property_value 
    ADD CONSTRAINT fk_property_key_id FOREIGN KEY (property_key_id) 
    REFERENCES property_key(id);