SQL:如何更新或插入如果不存在?

问题描述:

我有一个SQL插入下面,它工作正常,但我希望它检查如果DATE = xxxx,NAME = xxxx和JOB = xxx并更新HOURS,如果它们存在,否则插入新行。这可能与SQL?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+"');"); 

例如:

如果下面是在数据库中,约翰想更新自己的时间,它会检查名称,日期,工作都是一样的值试图插入,如果他们只是更新HOURS。否则,如果它们中的任何一个都不存在(John可能有几个小时针对另一个DATE或JOB记录)插入一个新行。

另外其他人也将在同一个DB中记录他们的小时和不同的角色,如下所示。

John | 12/12/2012 |清洁剂| 20 John | 12/12/2012 | ceo | 10 Jim | 12/10/2011 |清洁剂| 5

+0

是的,即使通过整体的方法,我最好的选择是'UNIQUE()'约束。 – Najzero 2013-02-11 07:16:23

您可以使用REPLACE INTO这样的:

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

但是,您必须创建唯一索引f或者这个工作:

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

注意,你应该使用唯一索引字段将确定两行被认为是相同的,应予以更换,而不是插入的这样的组合。

SQLFiddle Demo

请注意,如果您注释掉了独特的索引创建,它会stops working correctly

+0

那么,哪些INDEX的设置是独一无二的?如果其他人存在,我希望改变时间。 – Rhys 2013-02-11 07:46:42

+0

那么,你要求插入或替换行是否相同*,是否正确?因此,您必须在该字段组合上创建唯一的索引,以确定哪两行被认为是相同的*,并且应该替换而不是插入。 – mvp 2013-02-11 07:49:18

+0

我想检查NAME,DATE和JOB是否相同,以及是否用新值更新HOURS。如果他们不都存在,那么我想插入一个新的行与这些值。对不起,我一定没有说清楚 – Rhys 2013-02-11 08:00:34

我觉得这已经在这里问过SQLite的:

INSERT IF NOT EXISTS ELSE UPDATE?

好像他们有专门的语法:

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

那应该工作,出于expirience,对那个表上的级联键当心。那时他们经常被解雇。 – Najzero 2013-02-11 07:19:30

+0

谢谢,但这似乎不适用于我。它只是插入一条新线而不是更新。有什么建议么? – Rhys 2013-02-11 07:29:59

+1

@Rhys:结帐我的答案,它的工作原理 – mvp 2013-02-11 07:34:04