replace into last_recogs (id, hasher_id, hash_id, last_recog)
select l.* from
(select id, hasher_id, hash_id, [new_value] from last_recogs
where hasher_id in (select id from hashers where name=[hasher_name])
and hash_id in (select id from hashes where name=[hash_name])
union
select 0, m.id, h.id, [new_value]
from hashers m cross join hashes h
where m.name=[hasher_name]
and h.name=[hash_name]) l
limit 1;
3条答案
按热度按时间u91tlkcl1#
我遇到了一种情况,需要根据两个字段(都是外键)更新或插入一个表,而这两个字段不能设置唯一约束(所以插入。。。重复密钥更新将不起作用)。以下是我最终使用的:
这个示例来自我的一个数据库,输入参数(两个名称和一个数字)替换为[hasher\u name]、[hash\u name]和[new\u value]。嵌套的select…limit 1提取现有记录或新记录(last\u recogs.id是一个自动递增主键)中的第一个,并将其用作replace into的值输入。
iecba09b2#
你应该使用jai是正确的
INSERT ... ON DUPLICATE KEY UPDATE
.注意,不需要在update子句中包含datenum,因为它是唯一键,所以不应该更改。您确实需要包含表中的所有其他列。你可以用
VALUES()
函数以确保在更新其他列时使用正确的值。这是您的更新重新编写使用适当的
INSERT ... ON DUPLICATE KEY UPDATE
mysql的语法:pgky5nke3#
尝试使用以下选项:
如果您指定
ON DUPLICATE KEY UPDATE
,并插入一行,该行将导致UNIQUE index or
主键, MySQL performs an [
更新](http://dev.mysql.com/doc/refman/5.7/en/update.html)在旧的一排。。。 这个
ON DUPLICATE KEY UPDATE子句可以包含多个列赋值,用逗号分隔。 与
ON DUPLICATE KEY UPDATE,如果将行作为新行插入,则每行受影响的行值为1;如果更新现有行,则每行受影响的行值为2;如果将现有行设置为其当前值,则每行受影响的行值为0。如果您指定
CLIENT_FOUND_ROWS标记到
mysql_real_connect()` 连接到mysqld时,如果现有行设置为其当前值,则受影响的行值为1(而不是0)。。。