- 如果有就更新,没有就插入一条,先来一条简单的
INSERT INTO table_1 ( field_1, field_2 ) VALUES (value_1, value_2) ON DUPLICATE KEY UPDATE field_target = value_target
- table_1:要更新的表
- field_1...:要更新的字段, 字段中必须含有 UNIQUE 索引的字段,因为
ON DUPLICATE KEY
要依靠其工作- value_1...:执行Insert时要插入的值,即没有记录时执行的部分
- field_target = value_target:当有记录存在时,将 field_target 字段值更新为 value_target,允许多个字段和值存在
- 下面再执行一个稍复杂的,当满足 B 表某些条件时,就插入或更新 A 表中的记录
INSERT INTO user_table ( user_id, access_token )
SELECT ad.user_name, 'dcei32kad23-0-sdfjio'
FROM admin_table AS ad
WHERE ad.user_name = 'petty' AND ad.user_password = '123456'
ON DUPLICATE KEY UPDATE access_token = 'vbmkaslwe'
上面意思是:找到 admin_table 表中名字等于petty并且密码等于123456的记录,如果有就更新 user_talbe 表中 user_id = user_name 的那条记录的 access_token,使其值更改为 'vbmkaslwe',如果没有 user_id = user_name 的记录的话,就往 user_table 中插入一条新记录,该记录的 user_id 使用 ad.user_name 作为值,该记录的 access_token 使用 'dcei32kad23-0-sdfjio' 作为值。
- 多个表选择+条件+排序+分组
SELECT at.object_id AS id, at.title, at.time, at.time, at.`status`, COUNT(ae.user_id) AS `count`
FROM table_1 AS at
LEFT JOIN table_2 AS ae
ON ae.activity_id = at.object_id
WHERE at.deleted = FALSE
AND EXISTS(SELECT id FROM table_3 WHERE token = '' AND user_id = '' AND expires > TIMESTAMPDIFF(SECOND, allocate_time, now()))
GROUP BY at.id
ORDER BY at.time DESC
LIMIT 0, 10
上面的意思是:输出 xxx 列,从 table_1和table_2,关联条件是 table_2 中多个记录的 id 值要在 table_1 中存在(table_1:table_2=1:N),选择条件是 table_1 中没删除的 并且是满足 table_3 中某条件的那些个记录。把这些个记录按 table_1 的id分组(这样table_1的就不会重复),按 table_1 的时间倒序,这些记录只输出前10个