【问题标题】:Insert statement that checks for duplicate before insert在插入之前检查重复的插入语句
【发布时间】:2023-04-02 02:14:02
【问题描述】:

我需要插入,但前提是不存在类似记录
例如:

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

但要检查另一条记录中是否有相同的“主题”和“文本”:

  1. 不插入任何东西
  2. 更新“时间”和“用户 ID”

这两种情况我都需要 sql,因为我现在不确定要使用什么。
提前致谢!

【问题讨论】:

  • 您的意思是始终将请求设置为最新用户吗?
  • 对于 2. - 是的......但是对于 1. 如果有 simila 记录,我不想做任何事情。
  • 我认为如果他的请求被另一个人覆盖,用户会很生气,对吗?
  • @ajreal nope... 这将由管理员阅读,因此没有人关心谁确切地发布了请求。其实我认为user_id可以是一个集合...所以下一个id要添加到集合中。

标签: mysql sql insert duplicates


【解决方案1】:
INSERT INTO requests ('user_id','subject','text','time') 
VALUES (56,'test','test 1234',6516516)
ON DUPLICATE KEY UPDATE time = VALUES(time), user_id = VALUES(user_id)

将相关列设置为索引 UNIQUE。

这将插入一行,但如果主题或文本(或两者)已经存在,则改为使用给定的 timeuser_id 更新现有行

【讨论】:

  • '在重复密钥更新'。我们如何根据 user_id 和 subject 等 2 列进行 DUPLICATE 检查?
  • 这依赖于相关字段是唯一的/主要的,如果无法插入现有字段,则更新。在你的情况下,我不确定这个主题有什么独特之处。具有唯一 user_id 和 subject_id 的表可能会触发 ON DUPLICATE KEY UPDATE
  • 我不得不改变我的表的主键并且它起作用了。谢谢:)
【解决方案2】:

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

UPDATE
  requests
SET
  user_id = 56,
  time = 6516516
WHERE
  subject = 'test'
  AND text = 'test 1234'

然后您可以在 INSERT 中使用 SELECT 而不是 VALUES。如果记录已经存在,则不会插入任何内容...

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')

【讨论】:

  • 这是个好主意,但是,它在 MySQL 的语法上并不正确。此外,通过首先尝试“插入忽略”并检查 last_insert_id(假设您的表具有自动增量字段)可以更有效。如果返回一个值,则插入它,这样就完成了。如果它为空,则插入由于匹配键而被忽略,因此执行更新。 insert ignore requests (user_id, subject, text, time) values (56, 'test', 'test 1234', 6516516);
  • 当我无法使用唯一索引或不使用 ID 时,我使用此解决方案,只有您有语法错误,应该有 select 56, ... **FROM ANY_TABLE** ...
【解决方案3】:

你可以使用IGNORE命令

比如这样使用

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)

【讨论】:

    【解决方案4】:
    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
    

    【讨论】:

    • 是那些@ 符号用于变量,如在php中我可以使用美元符号$,其次你能解释一下你的查询吗,我想我知道开始和结束是什么意思在事务中但IFELSE,它们是mysql 关键字,我可以直接在mysqli_query 函数中使用该查询
    【解决方案5】:

    替换您的查询

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

    到,

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

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

    【讨论】:

      【解决方案6】:

      REPLACEmysql语句?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-20
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 2014-07-22
        相关资源
        最近更新 更多