我想通过创建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(lang
,name
),但它可能不是最好的方法。这个表结构太复杂了吗?
答案 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应该在第一列。