Mysql Insert语句,在Insert之前检查重复项

Mysql Insert语句,在Insert之前检查重复项,mysql,sql,insert,duplicates,Mysql,Sql,Insert,Duplicates,我需要进行插入,但仅当不存在类似记录时 例如: 在请求中插入('user_id','subject','text','time')值(56,'test','test1234',6516516) 但要检查另一条记录中是否有相同的“主题”和“文本”,请执行以下操作: 不插入任何内容 更新“时间”和“用户id” 对于这两种情况,我都需要sql,因为我现在不确定要使用什么。 提前谢谢 查看REPLACEmysql语句?首先,您可以进行更新。如果记录不存在,什么也不会发生 UPDATE request

我需要进行插入,但仅当不存在类似记录时
例如:

在请求中插入('user_id','subject','text','time')值(56,'test','test1234',6516516)

但要检查另一条记录中是否有相同的“主题”和“文本”,请执行以下操作:

  • 不插入任何内容
  • 更新“时间”和“用户id”
  • 对于这两种情况,我都需要sql,因为我现在不确定要使用什么。

    提前谢谢

    查看
    REPLACE
    mysql语句?

    首先,您可以进行更新。如果记录不存在,什么也不会发生

    UPDATE
      requests
    SET
      user_id = 56,
      time = 6516516
    WHERE
      subject = 'test'
      AND text = 'test 1234'
    
    然后可以在插入中使用“选择”而不是“值”。如果记录已存在,则不会插入任何内容

    INSERT INTO
      requests (
        user_id,
        subject,
        text,
        time
      )
    SELECT
      56,
      'test',
      'test 1234',
      6516516
    WHERE
      NOT EXISTS (SELECT * FROM requests WHERE subject = 'test' AND text = 'test 1234')
    
    将相关列设置为索引唯一


    这将插入一行,但如果主题或文本(或两者)已经存在,您可以使用给定的
    时间
    用户id
    更新现有行,您可以使用
    忽略
    命令

    IF NOT EXISTS (SELECT user_id, text from users where user_id = @user_id AND text = @text) BEGIN
       INSERT INTO users ....
    ELSE
       UPDATE users SET xyz=uvw where user_id = @user_id AND text = @text
    END
    
    例如,像这样使用

    INSERT IGNORE INTO requests ('user_id','subject','text','time') VALUES (56,'test','test 1234',6516516)
    
    而不是

    INSERT INTO requests ('user_id','subject','text','time') VALUES (56,'test','test 1234',6516516)
    

    替换来自的查询

    在请求中插入('user_id','subject','text','time')值(56,'test','test1234',6516516)

    对,

    替换为请求('user_id','subject','text','time')值(56,'test','test1234',6516516)


    这将给执行增加一点延迟,但它比任何其他方法都更有效

    您的意思是总是将请求设置为最新的用户吗?为2。-对但是对于我来说。如果有simila记录,我不想做任何事情。我想如果用户的请求被另一个人覆盖,他会非常生气,对吗?@ajreal no。。。这将由管理员读取,因此没有人关心谁确切地发布请求。实际上我认为用户id可以是一个集合。。。因此,下一个id将被添加到集合中。这是一个好主意,但是,对于MySQL来说,它在语法上并不正确。此外,如果先尝试“insert ignore”并检查最后一个\u insert\u id(假设您的表有一个自动递增字段),则效率会更高。如果返回了一个值,就插入它,这样就完成了。如果为null,则由于匹配的键,插入被忽略,因此执行更新<代码>插入忽略请求(用户id、主题、文本、时间)值(56,‘测试’、‘测试1234’、6516516)当我不能使用唯一索引或不使用ID时,我使用此解决方案,只有您有语法错误,应该有
    select 56**从任何表格**
    是那些
    @
    符号是变量,因为在php中我可以使用美元符号
    $
    ,其次,请您解释一下您的查询,我想我知道开始和结束在事务中是什么意思,但是
    如果
    其他
    ,它们是mysql关键字吗?我可以直接在
    mysqli\u query
    函数“重复密钥更新”中使用该查询吗。我们如何根据用户id和主题等两列进行重复检查?这取决于相关字段是否唯一/主要,如果无法插入现有字段,则会进行更新。就你的情况而言,我不确定这个主题有什么独特之处。具有唯一用户id和主题id的表可能会在重复密钥更新时触发。我必须更改表的主键,它可以正常工作。谢谢:)
    INSERT INTO requests ('user_id','subject','text','time') VALUES (56,'test','test 1234',6516516)