【问题标题】:SQL: How to update or insert if doesn't exist?SQL:如果不存在,如何更新或插入?
【发布时间】:2013-01-26 06:41:55
【问题描述】:

我在下面有一个 SQL 插入,它工作正常,但是我希望它检查是否 DATE=xxxx、NAME =xxxx 和 JOB = xxx,如果它们存在则更新 HOURS,否则插入新行。用 SQL 可以吗?

"INSERT INTO TABLE (NAME, DATE, JOB, HOURS) VALUES ('BOB', '12/01/01', 'PM','30');

尝试以下 OR REPLACE 的结果相同,每次都会添加一个新行。

add_time = conn.prepareStatement("INSERT OR REPLACE INTO RESOURCE (NAME, DATE, JOB, HOURS) VALUES ('"+name+"', '" + date + "', '"+job+"','"+hours+"');");

例如:

如果以下内容在数据库中,并且 John 想要更新他的工作时间,它将检查姓名、日期、工作是否与尝试插入的值相同,并且它们是否仅更新 HOURS。否则,如果它们都不存在一起(John 可能有几个小时记录在另一个 DATE 或 JOB 上)插入一个新行。

其他人也会将他们的工作时间和不同的角色记录在同一个数据库中,如下所示。

约翰 | 2012 年 12 月 12 日 |清洁剂 | 20 约翰 | 2012 年 12 月 12 日 |首席执行官 | 10 吉姆 | 2011 年 12 月 10 日 |清洁剂 | 5

【问题讨论】:

  • 是的,即使通过多种方法,我最好的选择是UNIQUE()约束。

标签: sql sqlite


【解决方案1】:

我认为之前这里已经针对 sqlite 提出过这个问题:

INSERT IF NOT EXISTS ELSE UPDATE?

似乎他们有这样的语法:

INSERT OR REPLACE INTO TABLE (NAME, DATE, JOB, HOURS) VALUES ('BOB', '12/01/01', 'PM','30');

【讨论】:

  • 这应该可以工作,但由于经验不足,请小心该表上的级联键。那时他们经常被解雇。
  • 谢谢,但这似乎对我不起作用。它只是插入一个新行而不是更新。有什么建议吗?
  • @gordatron 还是一样,我已经更新了我的问题给你看。我唯一的想法是 HOURS 会有所不同,因为这是我想要更新的部分。其余的都一样。
  • 我应该将所有其他设置为 UNIQUE 吗?
【解决方案2】:

你可以像这样使用REPLACE INTO

REPLACE INTO mytable (NAME, DATE, JOB, HOURS)
VALUES ('BOB', '12/01/01', 'PM','30')

但是,您必须为此创建唯一索引:

CREATE UNIQUE INDEX myindex
ON mytable(NAME, DATE, JOB)

请注意,您应该将此类字段组合用于唯一索引,以确定两行是否被视为相同并且应该替换而不是插入。

SQLFiddle Demo.

请注意,如果您注释掉创建唯一索引,则为 stops working correctly

【讨论】:

  • 那么,我将哪些 INDEX 设置为唯一? HOURS 是我想要更改的一个,如果其他存在的话。
  • 好吧,如果行相同,您要求插入或替换,对吗?因此,您必须在该字段组合上创建唯一索引,这将确定哪两行被视为相同,并且应该替换而不是插入。
  • 我想检查 NAME、DATE 和 JOB 是否相同,以及它们是否使用新值更新 HOURS。如果它们不全部存在,那么我想用这些值插入一个新行。对不起,我一定说得不够清楚
  • 那么(name,date,job) 上的唯一索引就足够了:SQLFiddle
  • 我已经更新了底部的问题,以帮助我更清楚地了解我所追求的内容
猜你喜欢
  • 1970-01-01
  • 2016-01-13
  • 2021-02-04
  • 2019-01-16
  • 1970-01-01
  • 2022-06-10
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多