2013-02-11 61 views
4

我有一個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

回答

9

您可以使用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

2

我覺得這已經在這裏問過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

相關問題