我应该将哪些列添加到PRIMARY KEY

时间:2013-01-29 12:14:47

标签: mysql sql primary-key

我想通过创建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。它可以是一个企业。假设麦当劳
lang :联系语言。
老板:老板的名字
特许经营:如果不是零,那就是特许经营权。麦当劳在罗马,巴黎,伦敦......

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

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

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

3 个答案:

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

答案 1 :(得分:1)

如果我的问题是正确的......你要问哪些栏目可供选择......而不是如何做到这一点?正确吗?

所以我猜这个特许经营号码不是一个布尔值(是/否)但是每个商店都有一个独特的数字?...每个国家?如果是这样,那么请使用id_c和特许经营权 如果没有,你可以选择它们中的所有4个......但我认为这不是一个好的实践。在这种情况下,我会说你应该再添加一列(例如trueID - autoincrement integer)并使用它一个作为你的主键。

答案 2 :(得分:0)

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