Подтвердить что ты не робот

Использовать несколько столбцов в качестве уникального идентификатора для mysql

У меня есть таблица mysql со следующими столбцами:

group_id
game_id
user_id
message
last_update

Я хочу сделать так, чтобы не существовало двух строк, где значение group_id для строки x равно значению group_id для строки y. И значение user_id для строки x также равно значению user_id для строка y.

Итак, скажем, допустим, что вставляю следующие значения:

group_id = 783
game_id = 34
user_id = 29237
message = none
last_update = 11233452

Приведенные выше данные, даже если запрос mysql пытается вставить его, не должны создавать новую строку, если строка уже существует с той же комбинацией group_id и user_id. Есть ли способ сделать это? В принципе, я пытаюсь заставить два столбца работать вместе как уникальный индекс.

4b9b3361

Ответ 1

Да, MySQL предоставляет возможность сделать это.

ALTER TABLE MyTable
ADD UNIQUE KEY `my_unique_key` (`group_id`, `user_id`)

Я не знаю, для чего вы используете эту таблицу, но похоже, что этот уникальный ключ может быть сильным кандидатом на первичный ключ таблицы. Первичный ключ также автоматически является уникальным ключом. Если вы решили сделать его первичным ключом, сделайте следующее:

ALTER TABLE MyTable
ADD PRIMARY KEY (`group_id`, `user_id`)

(Если вы получили сообщение об ошибке, что уже есть первичный ключ, введите ALTER TABLE MyTable DROP PRIMARY KEY и повторите вышеприведенную команду.)

Изменить: В ответ на комментарий пользователя

Вы не можете иметь несколько строк с одинаковыми значениями не NULL для столбцов, охватываемых уникальным ключом. Таким образом, вы не можете иметь две строки, где group_id = 0 AND user_id = 5, например. 0 - значение. Но если вы сделаете один или оба столбца нулевыми, вы можете иметь несколько строк, которые идентичны с позиционированием NULL s. Таким образом, у вас могут быть две (или более) строки, где group_id IS NULL AND user_id = 1234.

Proviso: Вышеупомянутое справедливо как для обычно используемых MySQL-систем хранения (MyISAM, так и для InnoDB). MySQL имеет механизмы хранения, в которых NULL рассматривается как уникальное значение, но вы, вероятно, не используете их.

Если вы делаете один или оба столбца нулевыми, то ваш уникальный ключ не может быть первичным ключом - первичный ключ должен быть в столбцах NOT NULL.

Предположим, что вы сделали этот ключ своим основным ключом, и теперь вы хотите разрешить NULL в столбце group_id. Я не знаю, какой тип данных group_id на данный момент; Я предполагаю, что это сейчас INT UNSIGNED NOT NULL, но вам придется изменить ниже, если это не так. Вы больше не сможете использовать этот ключ в качестве основного ключа. Вот команда, которую вы можете выполнить для внесения необходимых изменений:

ALTER TABLE MyTable
    DROP PRIMARY KEY,
    MODIFY group_id INT UNSIGNED,
    ADD UNIQUE KEY `my_unique_key_with_nulls` (`group_id`, `user`)

Ответ 2

Для этого вы можете создать составной ключ group_id и user_id с помощью любого редактора mysql, такого как phpmyadmin или sqlyog, и пометить его как уникальный индекс.