重复密钥更新 - 有条件
ON DUPLICATE KEY UPDATE - with condition
还没有对 INSERT INTO ... ON DUPLICATE KEY UPDATE 查询进行大量工作,所以请引导我找到解决方案。
数据库 table 名为 'tb_logs'
,有 4 列:
log_user_id, log_visitor_id, log_date, log_counter
我想插入数据,并且只更新 log_date
和 log_counter
,如果行 log_user_id AND log_visitor_id
已经存在且值与我要插入的值完全相同。
无论我尝试过什么,都无法正常工作,它更新了不应更新的行,或添加了不应添加的新行。
我最近的代码:
$sql = "
INSERT INTO tb_logs (
log_user_id,
log_visitor_id,
log_date,
log_counter
) VALUES (
'{$user}',
'{$visitor}',
UNIX_TIMESTAMP(CURRENT_TIMESTAMP),
'1'
) ON DUPLICATE KEY UPDATE
log_user_id='{$user}',
log_visitor_id='{$visitor}',
log_date=UNIX_TIMESTAMP(CURRENT_TIMESTAMP),
log_counter=log_counter+1
";
也许我只是没有正确理解 ON DUPLICATE KEY UPDATE 查询?
示例:
log_user_id log_visitor_id log_date log_counter
--------------------------------------------------------
1 5 23434234 1
当现在 log_user_id=1
AND log_visitor_id=5
时,不要插入新行,只更新 log_date
和 log_counter
这可能吗?
你应该在 (log_user_id, log_visitor_id)
上有一个唯一的复合键
ALTER TABLE `tb_logs` ADD UNIQUE (
`log_user_id` ,
`log_visitor_id`
);
然后
$sql = "
INSERT INTO tb_logs (
log_user_id,
log_visitor_id,
log_date,
log_counter
) VALUES (
'{$user}',
'{$visitor}',
UNIX_TIMESTAMP(CURRENT_TIMESTAMP),
'1'
) ON DUPLICATE KEY UPDATE
log_date=VALUES(log_date),
log_counter=log_counter+VALUES(log_counter)
";
是的,首先创建一个唯一索引。
ALTER TABLE `tb_logs`
ADD UNIQUE INDEX `user and visitor id` (`log_user_id`, `log_visitor_id`) USING BTREE;
然后像您所做的那样构造您的查询;
INSERT INTO tb_logs (
log_user_id,
log_visitor_id,
log_date,
log_counter
)
VALUES
('{$user}',
'{$visitor}',
UNIX_TIMESTAMP(CURRENT_TIMESTAMP),
'1')
ON DUPLICATE KEY
UPDATE log_counter = log_counter + 1, log_date = UNIX_TIMESTAMP(CURRENT_TIMESTAMP)
还没有对 INSERT INTO ... ON DUPLICATE KEY UPDATE 查询进行大量工作,所以请引导我找到解决方案。
数据库 table 名为 'tb_logs'
,有 4 列:
log_user_id, log_visitor_id, log_date, log_counter
我想插入数据,并且只更新 log_date
和 log_counter
,如果行 log_user_id AND log_visitor_id
已经存在且值与我要插入的值完全相同。
无论我尝试过什么,都无法正常工作,它更新了不应更新的行,或添加了不应添加的新行。
我最近的代码:
$sql = "
INSERT INTO tb_logs (
log_user_id,
log_visitor_id,
log_date,
log_counter
) VALUES (
'{$user}',
'{$visitor}',
UNIX_TIMESTAMP(CURRENT_TIMESTAMP),
'1'
) ON DUPLICATE KEY UPDATE
log_user_id='{$user}',
log_visitor_id='{$visitor}',
log_date=UNIX_TIMESTAMP(CURRENT_TIMESTAMP),
log_counter=log_counter+1
";
也许我只是没有正确理解 ON DUPLICATE KEY UPDATE 查询?
示例:
log_user_id log_visitor_id log_date log_counter
--------------------------------------------------------
1 5 23434234 1
当现在 log_user_id=1
AND log_visitor_id=5
时,不要插入新行,只更新 log_date
和 log_counter
这可能吗?
你应该在 (log_user_id, log_visitor_id)
上有一个唯一的复合键ALTER TABLE `tb_logs` ADD UNIQUE (
`log_user_id` ,
`log_visitor_id`
);
然后
$sql = "
INSERT INTO tb_logs (
log_user_id,
log_visitor_id,
log_date,
log_counter
) VALUES (
'{$user}',
'{$visitor}',
UNIX_TIMESTAMP(CURRENT_TIMESTAMP),
'1'
) ON DUPLICATE KEY UPDATE
log_date=VALUES(log_date),
log_counter=log_counter+VALUES(log_counter)
";
是的,首先创建一个唯一索引。
ALTER TABLE `tb_logs`
ADD UNIQUE INDEX `user and visitor id` (`log_user_id`, `log_visitor_id`) USING BTREE;
然后像您所做的那样构造您的查询;
INSERT INTO tb_logs (
log_user_id,
log_visitor_id,
log_date,
log_counter
)
VALUES
('{$user}',
'{$visitor}',
UNIX_TIMESTAMP(CURRENT_TIMESTAMP),
'1')
ON DUPLICATE KEY
UPDATE log_counter = log_counter + 1, log_date = UNIX_TIMESTAMP(CURRENT_TIMESTAMP)