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_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
是您的 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;
我对 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_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
是您的 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;