Какие колонки должны я добавлять к PRIMARY KEY

Я хочу составить таблицу и избежать дублированных записей, создавая PRIMARY 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 of customer. It can be an enterprise. Suppose McDonald's
lang: Contact language.
boss: Boss' name
franchise: If not zero, it is a franchise. McDonald's in Rome, Paris, London...

As you can see, each ENTERPRISE can have different central "shops" in each country (contact language), but also different franchises in each city (where boss' name would be different).

I want to be able to INSERT new rows where the id_c, lang can be not-distinct (many franchises in same country). But name has to be distinct only if (id_c,lang) is the same (for other id_c,lang combination... name could be the same). And franchise can be the same too only if it has not been assigned in the same (id_c,lang) pair.

I was thinking about a PRIMARY KEY (lang,name), but it might not be the best way. Is this table structure just too complex?

1
nl ja de

3 ответы

необходимо создать многочисленную колонку , УНИКАЛЬНЫЙ ограничение,

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;
2
добавлено
потому что я думал, что вы хотите иметь другой PK так that' s, почему я использовал УНИКАЛЬНЫЙ , а не PK . так или иначе оба создают автоматический индекс.
добавлено автор John Woo, источник
Спасибо. Но у меня все еще есть два вопроса: почему УНИКАЛЬНЫЙ и не ОСНОВНОЙ? Ограничение UNIQUE совпадает с УНИКАЛЬНЫМ ИНДЕКСОМ, isn' t это? Спасибо!
добавлено автор Mark Tower, источник

Если я разбираюсь, ваш вопрос... u спрашивают, какие колонки выбрать... и не, КАК сделать это? Правильный?

Таким образом, я предположил бы, что число франшизы не булево (ДА/НЕТ) вещь, но считает число уникальным для каждого магазина?... каждая страна? Если это так, тогда пойдите с id_c и франшизой.
Если не можно выбрать всех 4 из них, чтобы быть ключом..., но я думаю, что это не хорошая практика. В этом случае я сказал бы, что необходимо добавить еще одну колонку (trueID, например - целое число автоприращения) и использовать этого в качестве первичного ключа.

1
добавлено

Просто дайте Id как первичный ключ. Поскольку использование Id_c можно получить другие значения столбцов. Поскольку вы видите, что лучший совет состоит в том, чтобы создать ваш Основной id, должен быть в первой колонке.

0
добавлено
Спасибо..., но, если только id_c PK, то я мог дублировать записи. Например, у меня могла быть та же самая франшиза дважды для того же самого (id_c, lang, имя) пара.
добавлено автор Mark Tower, источник
DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)