2012-07-30 128 views
3

我需要更新一個表格行IF EXISTS,否則INSERT一個新行。 我想:SQLITE - INSERT或UPDATE不改變ROWID值

INSERT OR REPLACE INTO table VALUES ... 

,但如果該行的行存在這樣的語句更改行的ROWID,而這正是我想避免的(我需要的ROWID:d)

我也試着找在更新發生的情況下從更新中獲得某種返回值的方法,但我仍然不明白如何...如果能從update語句中獲得返回值,我可以選擇更新繼續插入或不插入。

你有任何建議或解決這個問題?或者我需要製作一個ROWID的副本,並使用它來代替「純」表ROWID?

在此先感謝,最好的問候

PS:我一直在尋找HERE,我想知道,如果sqlite的有OUTPUT特殊字太多,但谷歌並沒有幫助我..

----閱讀評論後編輯:

表模式例如

CREATE TABLE test (
    table_id TEXT NOT NULL, 
    some_field TEXT NOT NULL, 
    PRIMARY KEY(table_id) 
) 

INSERT or REPLACE INTO test (table_id, some_field) VALUES ("foo","bar") 
+0

你可以發佈一個表模式和一個完整的「插入或更換」的聲明? – 2012-07-30 10:13:17

+1

'ExecuteNonQuery'返回受影響的行數,因此如果您的更新返回0,請執行插入操作。 – Thomas 2012-07-30 10:16:00

回答

0

你需要指定你的table_idunique除了作爲主鍵:

sqlite> CREATE TABLE test (
    table_id TEXT NOT NULL, 
    some_field TEXT NOT NULL, 
    PRIMARY KEY(table_id), 
    UNIQUE(table_id) 
); 

sqlite> insert or replace into test values("xyz", "other"); 
sqlite> select * FROM test; 
xyz|other 
sqlite> insert or replace into test values("abc", "something"); 
sqlite> insert or replace into test values("xyz", "whatever"); 
sqlite> select * FROM test; 
abc|something 
xyz|whatever 
3

我測試了Chris的建議,但rowid仍然發生了變化。我認爲最好的選擇是做一個SELECT來查看是否存在具有該鍵的行。如果是這樣,更新,否則,插入...良好的舊時尚,但保證工作。

0

與選擇結合起來,這樣

INSERT or REPLACE INTO test (ROWID, table_id, some_field) 
VALUES ((SELECT ROWID from test WHERE table_id = 'foo' UNION SELECT max(ROWID) + 1 from test limit 1), 'foo','bar')