为什么我不能在此列上创建外键?

时间:2012-08-14 23:20:03

标签: mysql foreign-keys

我正在尝试创建两个具有一对多关系的表。以下是两者的模式:

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)
);

当我尝试在property_value上的property_keyprop_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,但我满足了那里的所有要求。如何缓解此问题?

1 个答案:

答案 0 :(得分: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);