【问题标题】:INSERT if the value doesn't already exists如果值不存在则插入
【发布时间】:2023-03-21 02:19:02
【问题描述】:

在我的数据库中,我有 tickets_users 将用户关联到一张票。

如果还没有这个users_id(例如用户1444)和type = 2 WHERE tickets_id = something(例如票号455),我想做一个INSERT来签入tickets_users;如果它已经存在,则什么也不做,否则

INSERT INTO tickets_users (tickets_id, users_id, type) VALUES (455, 1444, 2) 
WHERE tickets_id = 455

【问题讨论】:

  • 认为this 可能是您要找的东西?
  • Replace?不过需要注意的是,它与 Oracle 中的 MERGE 不同。这是INSERTs 或DELETEs 和INSERTs。
  • tickets_users.id 自动递增,如果类型、tickets_id 和 users_id 匹配,我不想删除旧的,什么都不做,只有在不匹配时才插入
  • 你为什么不先把所有你要插入的数据放到一个临时表中。然后使用“不存在”条件插入您的tickets_users。像 INSERT into tickets_users select * from temptable where temptable.tickets_id not in (select ticket_id from ticket_users) 之类的东西

标签: mysql insert conditional-statements


【解决方案1】:
INSERT INTO tickets_users (tickets_id, users_id, type) 
select 455, 1444, 2 from  dual
WHERE not exists (select 1 from tickets_users where type = 2 and tickets_id = something)

试试这个

编辑:
添加多行

INSERT INTO tickets_users (tickets_id, users_id, type) 
select 455, 1444, 2 from  dual
WHERE not exists (select 1 from tickets_users where type = 2 and tickets_id = 455)
union all 
select 456, 1444, 2 from  dual
WHERE not exists (select 1 from tickets_users where type = 2 and tickets_id = 456)

【讨论】:

  • 谢谢您的请求似乎有效,但我如何将此请求用于多个 INSERT?例如 SELECT 455,1444,2 WHERE Tickets_id = 455 但也 SELECT 425,1226,2 WHERE Tickets_id = 425 等等...
  • 您能否编辑您的答案,向我展示使用 Union all 时查询的外观,比如说 2 张门票?
  • 非常感谢,会试试,所以基本上我在每张票之间添加“union all”?
  • 以我目前的理解,是的。但同样取决于您从何处获取这些批量数据。你是从任何桌子上得到这个吗?如果是这样,我们可以向该表添加一个连接,而不是多个联合所有
  • 你在任何表中的意思是什么?我的请求将始终相同:从不存在的双重 WHERE 中选择 456、1444、2(从类型 = 2 和票据 ID = 456 的tickets_users 中选择 1)使用变量而不是 456,具体取决于我要检查的票证以及变量而不是 1444 取决于用户。
【解决方案2】:

您可以在具有适当字段的表上使用 PRIMARY KEY 或 UNIQUE 索引来阻止重复记录。

PRIMARY KEY 

使用 INSERT IGNORE 而不是 INSERT。如果一条记录不复制现有记录,MySQL 照常插入它。如果记录是重复的,IGNORE 关键字告诉 MySQL 静默丢弃它而不产生错误。

INSERT IGNORE

例如:假定 id 为主键。如果表 'tablename' 中的一条记录已经有一条 id = 1 的记录,那么查询将被忽略而不是产生警告。

注意:仅在开发阶段使用 IGNORE 关键字。这可能会导致意外结果,因为您无法确定记录是否已插入。

【讨论】:

  • 刚试了INSERT IGNORE INTO tickets_users (tickets_id, users_id, type, use_notification) VALUES (1, 1444, 2, 1) 还是加了,是我做错了吗?
  • r u 向列添加键
  • 我不认为INSERT IGNORE 是推荐的用法。它忽略了所有类型的错误,即使它应该被捕获为不正确的格式等。See this
  • 请看我的笔记
  • 我不想检查 ID,因为它是自动递增的,我只想检查 users_id、tickets_id 和类型
猜你喜欢
  • 2018-09-17
  • 2012-06-07
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 1970-01-01
  • 2016-05-15
相关资源
最近更新 更多