2014-01-21 4 views
1

Для составных ключей в MySQL, имеет ли порядок столбцов значение для обеспечения уникальности строк?MySQL Compound Primary Key Column-Order-Insенситивность

E.g.

CREATE TABLE test (
    A INT NOT NULL, 
    B INT NOT NULL, 
    PRIMARY KEY (A, B) 
); 

Теперь, предполагая, что у меня уже есть строка, содержащие значения A = 1, B = 2, будет MySQL отказаться вставить строку с A = 2, B = 1?

Я прошу об этом, потому что мне нужно решение, которое использует составной ключ &, игнорирует порядок значений.

+0

Нет, он не откажет – ITroubs

ответ

0

Упорядочения вопросов индекса. В качестве напоминания о том, почему порядок имеет значение, подумайте о том, что произойдет, если типы несовместимы - скажем date и varchar(255). Значения не являются взаимозаменяемыми.

Если вы хотите уникальность для обоих значений, то вам нужно будет добавить триггер. Вероятно, триггер может реализовать гораздо более простое условие, которое является требованием, чтобы A было меньше B. Это, в сочетании с первичным ключом, гарантирует уникальность двух значений. Вы можете выразить это ограничение в MySQL:

CONSTRAINT CHECK (A < B) 

Но, увы, MySQL будет анализировать код, но не выполняет проверку. Вместо этого вы можете добавить перед обновлением и перед вставкой триггеров поставить наименьшее значение в A. Вот пример:

CREATE TRIGGER table_beforeinsert BEFORE INSERT ON table 
    FOR EACH ROW 
    BEGIN 
     declare xx int; 
     if (NEW.A > NEW.B) then 
      set xx := NEW.A; 
      set NEW.A = NEW.B; 
      set NEW.B = xx; 
     endif; 
    END 
+0

Право. Таким образом, в этом случае, если существует строка с A = 1, B = 2, она не будет вставлять новую строку с B = 1, A = 2? – Mahouk

+0

@MachOSX. , , Я не знаю, о чем я думал. См. Пересмотренный ответ. –

+0

Ooooh. Теперь я вижу, что вы там делали. Да, я думаю, это сработает. Благодаря! – Mahouk

0

нет, это не имеет значения для уникальности, это не только важно для сортировки и времени доступа

+0

Итак, как я могу гарантировать, что одновременно может существовать не более одной строки, содержащей 2 определенных значения? Я могу запускать проверки перед выполнением вставок, но я предпочитаю более элегантное решение. – Mahouk

+0

Вы можете создать второй уникальный индекс – sqlab

0

Ха-ха, нет! Ключ является составной частью атрибутов.
Простите за то, что забавляло, это просто, что вы знаете, что значения
ваших атрибутов различны A: 1 = 2 и B: 2 = 1.
Только представьте строки в таблице!.
A | B
1 | 2
2 | 1

Представьте, как, например, строка concatation: «1: 2», а «2: 1».
Очевидно, что эти строки не равны.
Внутренне представление составного первичного ключа будет менее тривиальным, конечно,
Propably на основе хэш-функции, хранящегося в область временной памяти для просмотровых окон
который разделен на страницы, основанные
диапазона.

Так что важно не упорядочить атрибуты в ключе, а значения для
соответствующих столбцов.
На самом деле процесс определения того, какие атрибуты могут быть использованы лучше всего для первичного ключа соединения, является очень интересным.
Таким образом, вы должны четко понимать этот процесс, иначе вы можете задаться вопросом, почему вы испытываете непоследовательность данных
.
Возьмем в качестве примера человека таблицу:
Имя, ПгвЬЫате, дата рождения, улица, город, страна, штат, почтовый индекс
На самом деле ни один из атрибутов не удовлетворяет условию однозначной идентификации человека.
И имя, и имя.
Ну, так что имя и имя и дата рождения, а также город не так уж плох, но посмотрите
на сколько людей по имени Питер Смит живет в Лондоне (может быть, он находится в Великобритании или в
Онтарио, Канада).
Процесс определения ключа-кандидата фактически является процессом определения функциональных зависимостей между атрибутами.
По сути идея:
Если я знаю имя человека, я знаю его имя.
Если я знаю имя человека и его имя, знаю ли я, в каком городе он живет?
и так далее.
Эта зависимость зависит от:
Город, страна, штат -> zip // Значение: когда я знаю город, страну и страну, я знаю его почтовый индекс.
(и, конечно же, наоборот) Атрибуты, которые не отображаются в правой части списка зависимостей, должны быть частью каждого ключа конфессии.
Если каждый атрибут else определяется этими атрибутами, все готово. Вы получили свой первичный ключ соединения
.
Если нет:
Тогда процесс поиска оптимального ключа конфеты - это всего лишь шаги по использованию ключа
ключа, сделанного из всех атрибутов в таблице.
Затем удалите атрибуты, которые зависят. Перечислите все ключи конфет и повторите.
Затем посмотрите на сходства (какие ключи-кандидаты содержатся в других ключах-кандидатах, это называется сокращением).
Итак, вы получите оптимальный составной первичный ключ для вашей таблицы.
В качестве примера для первого случая:
Атрибуты
имя, B LastName, C City, D, E Государственный почтовый индекс (на международном уровне)
E -> C // международные молниями имеют форму, например, GB-W11 2BQ
E -> D
Таким образом, первым кандидатом будет:
A, B, E (поскольку они не отображаются с правой стороны).
Является ли каждый атрибут другим в зависимости? Да, есть только C и D. И они зависят от E
Все готово.

+0

Интересно. Правильный ответ на этот вопрос занижен, но вводящий в заблуждение ответ проголосовали и отметили как правильный? Я удивлен. – Peter

+0

Ответ Гордона Линоффа сделал для меня работу. Я не знаю, кто проигнорировал этот ответ. Он имеет полезную информацию. – Mahouk