【问题标题】:MySQL INSERT if record not existsMySQL INSERT 如果记录不存在
【发布时间】:2016-10-19 20:11:59
【问题描述】:

我想在 MySQL 表中插入一条新记录,但只有在没有具有相同 user_id 的记录时才应该插入它。此外,我想得到一个返回的布尔值,它显示是否插入了新记录。

The table  
like_id | user_id | post_id  
1 | 1 | 3  
2 | 5 | 3  
3 | 12 | 5  

示例
这个查询INSERT INTO blog_post_likes (post_id, user_id) VALUES (3, 1) 应该返回'false'/'0'/或其他具有相同含义的东西,因为已经存在具有相同user_id 的记录。 但是这个查询 INSERT INTO blog_post_likes (post_id, user_id) VALUES (3, 34) 应该返回 'true'/1/ 或其他具有相同 beaning 的东西,因为插入了一条新记录。

我该怎么做?

【问题讨论】:

    标签: php mysql database


    【解决方案1】:

    您必须在您想要唯一的列中创建一个 UNIQUE CONSTRAINT。在这种情况下,我们提到列 user_id..

    SQL 命令:

    CREATE TABLE blog_post_likes
    (
    post_id INT,
    like_id INT,
    user_id INT NOT NULL UNIQUE,
    ) 
    

    当然,您可以更改现有表格以避免丢失表格中的现有数据。

    ALTER TABLE blog_post_likes ADD CONSTRAINT user_id UNIQUE (user_id)
    

    【讨论】:

    • 我认为这行不通,因为用户可以喜欢不同的帖子。你知道我的意思吗?
    • @KingOfDog 但是用户只能喜欢 1 个帖子,对吗?那么这个选项是正确的,因为用户只能喜欢一次帖子。您可以省略 like_id,因为这没有用。
    • 就像@Perry 说的那样,用户只能以这种方式制作 1 个类似的 foreach 帖子。否则您不必使其独一无二,但用户可以为同一个帖子制作多个点赞。我认为这是你想要阻止的事情..
    • @Perry 我现在删除了 like_id 列,并创建了 post_id 和 user_id 主键。这行得通。
    【解决方案2】:

    您必须将两列都定义为主键。这样,如果您插入相同的记录,MySQL 应该返回一个“重复条目”错误。您应该检查此处引用的错误代码 1062:

    https://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html

    【讨论】:

      【解决方案3】:

      在插入数据之前,使用

      SELECT * FROM blog_post_likes WHERE post_id=give_postid AND user_id=give_userid;
      

      如果执行此查询返回一行,则表示用户已经喜欢该帖子。所以不要执行插入查询。

      如果没有返回任何行,则执行插入查询。

      你可以使用 mysqli_num_rows() 查找返回的行数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-14
        • 1970-01-01
        • 2012-07-07
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        • 2018-11-09
        • 2013-12-27
        相关资源
        最近更新 更多