1

我想通过创建一个主键来创建一个表并避免重复的条目。问题是我不知道应该将哪些列添加到此 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。它可以是一个企业。假设McDonald's
lang:联系语言。
boss : Boss' name
特许经营权:如果不为零,就是特许经营权。罗马、巴黎、伦敦的麦当劳……

如您所见,每个ENTERPRISE可以在每个国家拥有不同的中央“商店”(联系语言),但在每个城市也可以有不同的特许经营权(老板的名字会不同)。

我希望能够插入新行,其中id_clang可能不明显(同一国家/地区的许多特许经营权)。但是只有当 (id_c,lang)相同(对于其他 id_c,lang 组合...名称可能相同)。只有当没有在同一 (id_c,lang) 对中分配特许经营权时,特许经营权也可以相同。

我在考虑 PRIMARY KEY ( lang, name),但这可能不是最好的方法。这个表结构是不是太复杂了?

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

如果我的问题是正确的...您是在问要选择哪些列...而不是如何做?正确吗?

所以我猜特许经营号码不是布尔(是/否)的东西,而是每个商店都有一个唯一的号码?......每个国家?如果是这样,那么使用 id_c 和特许经营权。
如果不是,您可以选择所有 4 个作为关键...但我认为这不是一个好习惯。在这种情况下,我会说您应该再添加一列(例如 trueID - 自动增量整数)并使用它一个作为您的主键。

于 2013-01-29T12:34:00.063 回答
0

只需将 Id 作为主键。因为使用 Id_c 您可以获得其他列值。如您所见,最好的建议是创建您的 Primary id 应该在第一列。

于 2013-01-29T12:22:17.160 回答