MySQL / Избегайте дублирования — (ВСТАВИТЬ, УНИКАЛЬНО, ЗАМЕНИТЬ)

Я работал над своей собственной / небольшой платформой для социальных сетей, и я почти закончил, за исключением следующей проблемы:

У меня есть профили для всех моих пользователей, где один пользователь может комментировать чужой профиль. Итак, есть пользовательская таблица, которая выглядит так:

id | имя | имя_файла | … |

И таблица для добавления / получения комментариев к / от:

id | author_id | receive_id | комментарий |

Все это прекрасно работает, за исключением одной маленькой проблемы: я хочу убедиться, что каждый пользователь может прокомментировать только один профиль. После этого они переписывают свой предыдущий комментарий. Это означает, что мне нужно проверять ту же комбинацию «author_id» и «receive_id», прежде чем вставлять комментарий в базу данных.

Исследуя это, я обнаружил, что есть «уникальные» клавиши, в которых вы можете объединить два столбца, но я не совсем уверен, как реализовать это для моей текущей проблемы, или даже если это лучший путь.

Пример (пользователь):

1, Доу, Джон

2, Доу, Джейн

Пример (комментарий):

1, 1, 2, «Привет, я великолепен!» (Джон комментирует Джейн)

2, 2, 1, «Что случилось?» (Джейн комментирует Джона)

Пример (вставить):

XXX, 1, 2, «Nevermind» (Джон снова комментирует / меняет свои комментарии, и № 1 заменяется)

Новый результат (Комментарии):

1, 1, 2, «Nevermind» (Новый комментарий Джона)

2, 2, 1, «Что случилось?» (Комментарий Джейнса остается прежним)

Если бы вы могли помочь мне здесь — это было бы здорово!

С наилучшими пожеланиями, Мартин

2

Решение

Вы можете использовать ключ UNIQUE и операторы REPLACE, чтобы сделать это.

Примером такой таблицы будет:

CREATE TABLE profile_comment (
id INT NOT NULL AUTO_INCREMENT,
author_id INT NOT NULL DEFAULT 0,
receiver_id INT NOT NULL DEFAULT 0,
comment TEXT NOT NULL,

PRIMARY KEY id,

UNIQUE (author_id,receiver_id)

) [...character set and collation...];

Затем вы будете использовать такой оператор, чтобы вставить или обновить таблицу:

REPLACE INTO profile_comment(author_id,receiver_id,comment)
VALUES (<n>,<n>,<text>);

Источник: MySQL 5.0 Manual, ЗАМЕНИТЕ синтаксис

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

3

Другие решения

Сначала вы добавляете уникальный ключ:

 ALTER TABLE comment ADD UNIQUE( author_id, receiver_id);

Затем вы можете вставить или обновить следующий запрос:

INSERT INTO comment (author_id,receiver_id ,comment ) VALUES (1,2,"Nevermind") ON DUPLICATE KEY UPDATE comment = VALUES(comment)

Для получения дополнительной информации вы можете посмотреть здесь: https://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html

3

По вопросам рекламы [email protected]