УНИКАЛЬНОЕ Ограничение на Комбинацию двух значений столбца

0

Не был уверен, как сформулировать вопрос так плохо, если это звучит странно.

У меня есть таблица в моей базе данных под названием friendRequests со следующими столбцами: id, sender_id, recipient_id и status. Как я могу убедиться, что никакая другая строка не дублирует значения recipient_id и sender_id?

Например, если у меня была строка в таблице со следующими значениями: (1, 4, 6, 0), как я могу убедиться, что никакая другая строка не имеет sender_id из 4 и recipient_id из 6 И что никакой другой строка имеет sender_id из 6 и recipient_id из 4?

Теги:

3 ответа

0
Лучший ответ

Для тех same relations - используйте уникальное ограничение для <sender, receiver>.

Обратное отношение <receiver, sender> однако, будет возможно, вызывая его разные идентификаторы для единственного ограничения ключа.

Чтобы справиться с этим (используя ограничение ключа uniqe), вам нужно добавить еще один столбец, позвольте ему называть его friendship Там вы добавите уникальное ограничение ключа и вставьте идентификаторы пользователей, объединенные, НО ЗАКАЖИ:

Т.е. если пользователь 3 отправляет запрос друга на 10, вы введете 3-10 в этот столбец. Если приглашение будет от 10 до 3, вы также добавите 3-10.

Таким образом, вы можете отслеживать, что ВОЗ инициировала дружбу (sender_column=3, receiver-column=10), но также гарантирует, что нет обратного приглашения (friendship=3-10 уже существует)

Так что что-то вроде

INSERT INTO friendships(sender, receiver, friendship) VALUES(3,10,"3-10");
or vice versa:
INSERT INTO friendships(sender, receiver, friendship) VALUES(10,3,"3-10");

Одна из двух ограничений позволит избежать вставки, если дружба уже запрошена. (Фактически второе ограничение было бы достаточно для любого случая, первые 2 столбца могли бы только определить активную и пассивную часть дружбы.)

  • 0
    Я бы сказал, что хуже всего использовать строковое поле и просто создать еще два столбца с уникальным ограничением для них обоих.
  • 0
    Я на самом деле думал о том, чтобы сделать что-то вроде второго ограничения, но не был точно уверен, как это будет работать / как его реализовать. Спасибо за объяснение.
Показать ещё 16 комментариев
0

Я слышу, что если пользователь A приглашает пользователя B, вы не хотите создавать новую запись для пользователя B, предлагающего использовать A.

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

  • 0
    Итак, мне нужно просто выполнить проверку запроса, если запрос о дружбе уже существует между обоими пользователями, и создать его, если его нет? Это действительно лучший способ сделать это?
  • 0
    @NatividadAlvarez Я думаю, что предложение от dognose использовать отдельное поле (поля) может быть хорошей альтернативой.
Показать ещё 1 комментарий
0

Вы должны создать уникальный индекс в таблице.

create unique index sender_recipient
on friendRequest (sender_id, récipient_id) 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню