【问题标题】:MySQL/PHP - Avoid duplicates - (INSERT, UNIQUE, REPLACE)MySQL/PHP - 避免重复 - (INSERT, UNIQUE, REPLACE)
【发布时间】:2015-04-29 10:58:00
【问题描述】:

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

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

标识 |姓名 |名字 | ... |

还有一个用于添加/检索 cmets 的表:

标识 |作者_id |接收者 ID |评论 |

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

研究这个我发现有“唯一”键,您可以在其中组合两列,但我不确定如何针对我当前的问题实施它,或者即使它是最好的方法去.

示例(用户):

1,多伊,约翰

2,Doe,简

示例(注释):

1、1、2,“嗨,我很棒!” (John cmets on Jane)

2、2、1,“怎么了?” (Jane cmets on John)

示例(插入):

XXX, 1, 2, "Nevermind" (John cmets 再次/改变他的 cmets 并且 #1 被替换)

新结果(评论):

1、1、2,“没关系”(John 的新评论)

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

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

最好的问候,马丁

【问题讨论】:

    标签: php mysql replace unique profile


    【解决方案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, REPLACE syntax

    请注意,您必须避免为 REPLACE 语句提供 id 参数,因为在这种情况下,主键和唯一键都可能导致记录被删除。

    【讨论】:

    • 我认为最好的解决方案。边注:你可以尝试让一些php乱码以避免重复的cmets,但它当然应该在数据库层进行优化。在这种情况下,您的数据库是稳定的,将来可能连接到您的数据库的其他应用程序不会搞砸任何事情。如果需要,好的做法是使用 ON DUPLICATE KEY 来自动清理/自动更新数据库表。也许这个笔记会帮助某人。来自我的 +1。
    【解决方案2】:

    首先你添加唯一键:

     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

    【讨论】:

      猜你喜欢
      • 2017-08-23
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 2019-05-03
      相关资源
      最近更新 更多