2012-06-05 63 views
0

我正在做的是插入一條記錄,然後使用相同的ID禁用以前的記錄,因爲它們將不再被使用。不過,我期待着以最簡單的方式做到這一點。刪除記錄確實不是一種選擇。Mysql:在更新查詢的兩個條件下切換int字段的值

嘗試操作順序:

  1. 插入活躍INUSE價值inUse = 1
  2. 更新爲同一ID下面的記錄是不再使用:inUse = 0

我首先想到的是運行此查詢:

UPDATE page_tags SET inUse = IF(inUse = 1, 0, 1) WHERE page_id = 23678459 AND tag_id NOT IN (10, 4);

此查詢的唯一問題是,如果它再次運行,它會將所有這些停用的值切換回1.我需要特定ID的所有標記才能切換回來,前提是它們被WHERE聲明。

+1

你可以做inUse'的''無條件向update' 0作爲第一查詢然後用'inUse = 1'插入''。有沒有理由不這樣做? – ManieQ

+0

@ManieQ我曾想過這件事,但無論哪種方式,我仍然認爲你需要某種方式來看它,因爲如果一個標籤已經存在,我不會添加一個新的,我會使用現有的。所以我需要不停用該標籤,或重新激活它... – stwhite

回答

0

@John P有一個體面的答案,但他的答案需要使用觸發器。對我來說,這似乎是解決手頭問題所需要的。當前工作的解決方案是:

page_tags.page_idpage_tags.tag_id創建唯一索引

更新的所有行* PAGE_ID = 234234 *

UPDATE page_tags SET inUse = 0 WHERE page_id = 234234 

插入標籤:

INSERT INTO page_tags (page_id, tag_id, inUse) VALUES (234234, 49343, 1) ON DUPLICATE KEY UPDATE inUse = 1 
1

聽起來像是一個觸發工作。或許會這樣做(僞代碼)?

更新處理previuos標籤的重用:

做你的插入/更新:

INSERT INTO ... ON DUPLICATE KEY UPDATE 

然後用兩個觸發器,一個用於插入和一個更新。

CREATE TRIGGER tr_inuse_insert BEFORE INSERT ON page_tags 
    FOR EACH ROW BEGIN 
    UPDATE page_tags SET inuse=0 WHERE page_id = NEW.page_id; 
    END; 

CREATE TRIGGER tr_inuse_update BEFORE UPDATE ON page_tags 
    FOR EACH ROW BEGIN 
    UPDATE page_tags SET inuse=0 WHERE page_id = NEW.page_id; 
    END; 
+0

(編輯)約翰,感謝您的建議。我看到的唯一問題是如果標籤已經存在,我想激活它以便重用(inUse = 1)。沒有什麼意義,爲重複標記ID添加新行 – stwhite

+0

好吧,除了「插入記錄,然後使用相同的ID停用先前的記錄,因爲它們不再被使用」,還有更多嗎? –

+0

也是發佈的問題的一部分:「我需要特定ID的所有標記才能切換回來,如果它們是由WHERE語句指定的。」所以約翰,雖然這當然是一個合適的答案,但這不是我所追求的。原因是因爲你的回答需要觸發器,這似乎超過了需要。 – stwhite