Я работал над своей собственной / небольшой платформой для социальных сетей, и я почти закончил, за исключением следующей проблемы:
У меня есть профили для всех моих пользователей, где один пользователь может комментировать чужой профиль. Итак, есть пользовательская таблица, которая выглядит так:
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, «Что случилось?» (Комментарий Джейнса остается прежним)
Если бы вы могли помочь мне здесь — это было бы здорово!
С наилучшими пожеланиями, Мартин
Вы можете использовать ключ 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, так как и первичный ключ, и уникальный ключ могут вызвать удаление записи в этом сценарии.
Сначала вы добавляете уникальный ключ:
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