我对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'都不是唯一的,但是单行中两者的组合将是唯一的。
答案 0 :(得分:2)
您希望on duplicate key
更新。但首先,您需要worker_id
和date
上的唯一索引:
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 TABLE和CREATE 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;