MySQL / PHP - 避免重复 - (INSERT,UNIQUE,REPLACE)

时间:2015-02-26 21:27:28

标签: php mysql replace unique profile

我一直在自己的/小型社交媒体平台上工作,除了以下问题我几乎完成了:

我有我的所有用户的个人资料,其中一个用户可以评论某人的个人资料。所以有一个用户表看起来像:

id |名字| first_name | ...... |

用于添加/检索评论的表格:

id | author_id | receiver_id |评论|

所有这一切都很有效,除了一个小问题:我想确保每个用户只能在任何个人资料上发表评论一次。之后他们会覆盖以前的评论。这意味着我必须在将注释插入数据库之前检查相同的“author_id”和“receiver_id”组合。

研究这个我发现有“独特”的键可以将两列合并,但我不确定如何为我当前的问题实现它,或者即使它是最好的方法

示例(用户):

1,Doe,John

2,Doe,Jane

示例(评论):

<1,2>,“嗨,我很棒!” (约翰评论简)

2,2,1,“怎么了?” (简评论约翰)

示例(插入):

XXX,1,2,“没关系”(约翰再次评论/改变他的评论,#1被替换)

新结果(评论):

1,1,2,“Nevermind”(John的新评论)

2,2,1,“怎么了?” (简氏评论保持不变)

如果你能在这里帮助我 - 那就太好了!

最好的问候,马丁

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

您可以使用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, REPLACE syntax

请注意,您必须避免为REPLACE语句提供id参数,因为主键和唯一键都可以导致在该场景中删除记录。