2015-01-06 74 views
1

我對SQL有點新,所以我希望這不會成爲一個愚蠢的問題。我想創建一個調度程序,其中表是這樣的:SQL - 更新或插入通過檢查兩列

event_id worker_id date   shift_type 
1   1   2014-01-01  Labour Day Shift 
2   1   2014-01-02  Labour Night Shift 
3   2   2014-01-01  Engineer Day Shift 
4   2   2014-01-02  Engineer Night Shift 
5   3   2014-01-01  Electrician Day Shift 
6   3   2014-01-02  Electrician Day Shift 

正如你所看到的,我對待每一個「轉變」作爲事件。當我插入數據庫時​​,我想要一種方法來檢查'worker_id'和'date'是否已存在於同一行下的表中,如果是這樣,則使用UPDATE而不是INSERT。請注意,'worker_id'或'date'都是唯一的,但是這兩者在一行中的組合是唯一的。

+2

請參閱'REPLACE'語法。 – i486

+0

只需在i486註釋中添加更多詳細信息,爲worker_id和日期字段設置一個唯一索引來強制唯一性,然後您可以使用「替換」而不是插入/更新,將所有檢查留給數據庫。 – ptrk

+0

[MySQL'UPDATE ON DUPLICATE KEY'沒有唯一列?]的可能的重複?()(http://stackoverflow.com/questions/3180913/mysql-update-on-duplicate-key-without-a-unique-column) –

回答

2

你想要on duplicate key更新。但首先,你需要worker_iddate唯一索引:

create unique index idx_table_worker_date on table(worker_id, date); 

insert into table(worker_id, date, shift_type) 
    values (@worker_id, @date, @shift_type) 
    on duplicate key update shift_type = values(shift_type); 

table是你的表名的佔位符。以@開頭的變量是要插入的值的佔位符。

1

由於組合worker_id和日期都是獨一無二的,你可以依靠INSERT拋出一個重複的錯誤:

INSERT INTO table (event_id, worker_id, date, shift_type) 
    VALUES (1, 1, @date, @shift) 
    ON DUPLICATE KEY UPDATE event_id=1, shift_type=values(shift_type); 

INSERT ... ON DUPLICATE KEY文檔。

爲了澄清,你可以聲明多個字段的組合獨特:

UNIQUE KEY 'key_name' (column_one, column_two, ... etc.) 

進一步澄清見ALTER TABLECREATE TABLE

+0

根據我的理解,爲了使用這個'worker_id'和'date'必須是:UNIQUE index或PRIMARY KEY,它們不是唯一的,因爲它們只是作爲一起使用的唯一組合,不會被mysql重新強制執行。我不理解什麼嗎?對不起,如果我現在是這個問題... – joey

+0

當插入一個唯一鍵(可以是幾個列的組合)的表中時,INSERT語句將強制執行該約束。 – Brian

0
// create a composite index 
CREATE INDEX my_composite_index ON my_table (worker_id, date); 

// insert or update 
INSERT INTO my_table (worker_id, date, shift_type) VALUES ('value1', 'value2', 'value3') ON DUPLICATE KEY UPDATE shift_type=shift_type+1;