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

SQL - UPDATE or INSERT by checking two columns

我对 SQL 有点陌生,所以我希望这不会成为一个愚蠢的问题。我正在尝试创建一个调度程序,其中 table 是这样的:

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

如您所见,我将每个 "shift" 视为一个事件。当我插入数据库时​​,我想要一种方法来检查 'worker_id' 和 'date' 是否已经存在于同一行下的 table 中,如果存在,则使用 UPDATE 而不是 INSERT。请注意,'worker_id' 或 'date' 都不是唯一的,但是在一行中两者的组合将是唯一的。

您想要 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 是您的 table 姓名的占位符。以 @ 开头的变量是您要插入的值的占位符。

由于 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 TABLE and CREATE TABLE 了解进一步说明。

// 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;