0

次のような言語テーブルがあります。

 -id
 -name
 -iso

複数のテーブルで、このisoフィールドを外部キーとして参照する必要があります。問題は、完全に一意の FK 名を付けても、それができないことです。問題は何ですか?

私の言語テーブルの構成は次のとおりです。

CREATE TABLE `Languages` (
  `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `iso` char(2) NOT NULL,
  `name` varchar(255) NOT NULL,
  `description` varchar(255) NOT NULL,
  `order` tinyint(3) NOT NULL DEFAULT '0',
  `active` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
4

1 に答える 1

0

親テーブルと子テーブルの列のデータ型が同じであることを確認してください。親テーブルの iso 列にもインデックスを作成します。現在所有しているテーブルとそれらに使用した SQL に関する質問に詳細がないため、データベースと比較できる例をいくつか挙げてみましょう。

異なるデータ型の例:

create table languages (
    id int,
    name varchar(100),
    iso char(3),
    primary key(id)
);
create index ix_countries_iso on languages(iso);

create table countries (
    id int,
    iso int,
    foreign key(iso) references languages(iso)
);
ERROR 1215 (HY000): Cannot add foreign key constraint

親テーブルの欠落インデックスの例:

create table languages (
    id int,
    name varchar(100),
    iso char(3),
    primary key(id)
);
-- notice that we aren't creating an index on iso

create table countries (
    id int,
    iso char(3), -- notice correct datatype in child and parent table
    foreign key(iso) references languages(iso)
);
ERROR 1215 (HY000): Cannot add foreign key constraint

親と子のデータ型が同じで長さが異なる場合はどうなりますか? データ型と長さを同じに保つことをお勧めしますが、次のステートメント機能します。

create table languages (
    id int,
    name varchar(100),
    iso char(3),
    primary key(id)
);
create index ix_countries_iso on languages(iso);

create table countries (
    id int,
    iso char(10), -- will work, but don't do this
    foreign key(iso) references languages(iso)
);

create table countries2 (
    id int,
    iso char(1), -- will work also, but don't do this
    foreign key(iso) references languages(iso)
);

データベース構造と比較できる外部キーの実用的なソリューションの例を見てみましょう。

create table languages (
    id int,
    name varchar(100),
    iso char(3),
    primary key(id)
);
create index ix_countries_iso on languages(iso);

create table countries (
    id int,
    iso char(3), -- same datatype
    foreign key fq_countries_languages(iso) references languages(iso)
);

create table boundaries (
    id int,
    iso char(3), -- same datatype
    foreign key fq_boundaries_languages(iso) references languages(iso)
);

また、外部キーに依存する子テーブルにもインデックスを作成することをお勧めします。外部キーに関するちょっとした記事をチェックしてください。

于 2013-09-14T14:32:26.793 に答える