2

1 対多の関係を持つ 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)
);

property_valueproperty_keyonの間に外部キー関係を追加しようとするとprop_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 リファレンス マニュアルを参照しましたが、そこにあるすべての要件を満たしています。この問題を軽減するにはどうすればよいですか?

4

1 に答える 1

3

1 つの問題は、フィールドが大きすぎることです。 InnoDB にはキーあたり 768 バイトのフィールド制限があり、作成される外部キーは約 8KB です。さらに、外部キーが一意であることを保証することはできません。

これを軽減する 2 つのオプション - VARCHAR フィールドのサイズを 768 バイト未満に減らすか、id代わりに 2 つのフィールドにインデックスを付けることができます。

ALTER TABLE property_value
    ADD CONSTRAINT fk_property_key_id FOREIGN KEY (property_key_id)
    REFERENCES property_key(id);
于 2012-08-14T23:20:03.183 に答える