2013-08-19 141 views
3

我在這裏面臨一個小問題。我有一個多列的表,但我想要寫的sqlite查詢將用於我的python腳本,以便我可以插入如果找不到密鑰或者如果已找到密鑰更新其他值。我研究了一下,並通過了這個answer,但我的內容關注我的內容,它不工作,並繼續添加新的行,即使它存在。插入或更新sqlite3

使用this我寫了一個查詢,因爲我的更新/插入依賴於稱爲id的列,這是該表的外鍵約束。其他兩列,我想更新說的名稱和角色。所以我想要做的是插入所有三個,如果沒有找到id。如果找到,則查看它是否具有相同的值或不是其他兩列並更新它。這是我的嘗試。

INSERT OR REPLACE INTO tblExample(id, name, role) VALUES (COALESCE((SELECT id FROM tblExample WHERE id = 1),'1'),'name','role');

但它仍然是插入新行。爲什麼?我怎麼能避免它?更簡單的解決方案?

回答

0

這應該有效,但訣竅在於確保您的id(我認爲這是此表的主鍵)與現有id相匹配,否則它不會將其視爲重複記錄。

+0

不是,它是表的外鍵主鍵是一個單獨的列 – user9517536248

1

幾件事情:

  1. 重複檢測是基於你插入到表的PRIMARY KEY定義。如果您尚未在表格中明確定義主鍵,則它將使用唯一的ROW_ID值(並且您將始終獲得一個新行)。這張桌子的PRIMARY KEY是什麼?

  2. INSERT OR REPLACE確實替換了行,而不是UPDATE。這意味着,如果檢測到重複且選擇了REPLACE通路,則語句中未給定值的任何列將更新爲其值或更新爲NULL,如果沒有指定DEFAULT。換句話說,如果你的表有一個名爲city的附加列,並且一行被替換,那麼city將是NULL,而不是它在原始行中的值。

+0

該表具有它自己的主鍵,這是自動增量。我想用來更新的ID是該表的外鍵@larry – user9517536248

+0

INSERT OR REPLACE將僅使用PRIMARY KEY進行重複分辨率(實際上,它將使用任何唯一鍵)。它不能使用FOREIGN KEY,因爲它們不是唯一的,如果需要更換,它們不會告訴引擎要更換哪行。如果FOREIGN KEY *也是*唯一的,那麼您還需要創建一個UNIQUE INDEX。 –

+0

你能爲我的問題提供替代解決方案嗎? – user9517536248