SQL - 通过检查两列来更新或插入

时间:2015-01-06 22:24:45

标签: mysql sql database

我对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'都不是唯一的,但是单行中两者的组合将是唯一的。

3 个答案:

答案 0 :(得分: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 :(得分:1)

由于worker_id和date的组合是唯一的,因此您可以依赖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

答案 2 :(得分: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;