1

PRIMARY KEYを作成して、テーブルを作成し、エントリの重複を避けたい。問題は、このKEYにどの列を追加すべきかわからないことです。次の表を検討してください。

CREATE TABLE `customers` (
  `id_c` int(11) unsigned NOT NULL,
  `lang` tinyint(2) unsigned NOT NULL,
  `name` varchar(80) collate utf8_unicode_ci NOT NULL,
  `franchise` int(11) unsigned NOT NULL,
  KEY `id_c` (`id_c`),
  KEY `lang` (`lang`),
  KEY `franchise` (`franchise`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

id_c:顧客のID。それは企業である可能性があります。マクドナルドの
言語:連絡先の言語を想定します。
ボス:ボスの名前
フランチャイズ:ゼロでない場合、それはフランチャイズです。マクドナルドはローマ、パリ、ロンドンにあります...

ご覧のとおり、各企業は国ごとに異なる中央の「ショップ」(連絡先言語)を持つことができますが、都市ごとに異なるフランチャイズを持つこともできます(上司の名前は異なります)。id_clang

が区別できない 新しい行を挿入できるようにしたい(同じ国の多くのフランチャイズ)。ただし、名前は次の場合にのみ区別する必要があります(id_c、lang)は同じです(他のid_c、langの組み合わせの場合...名前は同じである可能性があります)。また、フランチャイズは、同じ(id_c、lang)ペアで割り当てられていない場合にのみ同じにすることができます。

主キー(langname)について考えていましたが、最善の方法ではないかもしれません。このテーブル構造は複雑すぎますか?

4

3 に答える 3

2

UNIQUE複数列の制約を作成する必要があります。

CONSTRAINT tb_uq UNIQUE (id_c,lang, name)

またはそれらを主キーとして設定し、

CREATE TABLE `customers` 
(
  `id_c` int(11) unsigned NOT NULL,
  `lang` tinyint(2) unsigned NOT NULL,
  `name` varchar(80) collate utf8_unicode_ci NOT NULL,
  `franchise` int(11) unsigned NOT NULL,
  KEY `id_c` (`id_c`),
  KEY `lang` (`lang`),
  KEY `franchise` (`franchise`),
  CONSTRAINT tb_PK PRIMARY KEY (id_c,lang, name)    --- <<== compound PK
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
于 2013-01-29T12:24:20.170 に答える
1

あなたの質問が正しければ...あなたはどの列を選ぶべきかを尋ねています...それを行う方法ではありませんか?正しいですか?

だから私は、フランチャイズ番号はブール値 (YES/NO) ではなく、各ショップに固有の番号を保持していると思いますか?...各国? その場合は、id_c とフランチャイズを使用してください。
そうでない場合は、4つすべてをキーとして選択できます...しかし、それは良い習慣ではないと思います.その場合、もう1列(たとえばtrueID-自動インクリメント整数)を追加して、これを使用する必要があります1 つを主キーとして使用します。

于 2013-01-29T12:34:00.063 に答える
0

Id を主キーとして指定するだけです。Id_c を使用すると、他の列の値を取得できるためです。ご覧のとおり、プライマリ ID を最初の列に作成することをお勧めします。

于 2013-01-29T12:22:17.160 に答える