表tb_name:
MySQL> desc tb_name; +--------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +--------------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | station | int(11) | NO | MUL | NULL | | | seq | int(11) | NO | | NULL | | | meaning | varchar(40) | NO | | | | | data | float | NO | | 0 | | | notes | varchar(200) | NO | | | | | rectime | datetime | NO | | NULL | | +--------------+--------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec)mysql>需求:同一時間update表tb_name多次,每條記錄的內容不相同
對于更新記錄,update語法不支持一次更新多條記錄,只能一條一條執行:
update tb_name set data = '111',rectime = '2017-01-02' where station = 'a' and seq = 1;update tb_name set data = '111',rectime = '2017-01-02' where station = 'a' and seq = 2;update tb_name set data = '111',rectime = '2017-01-02' where station = 'a' and seq = 3;當update list非常大時,執行效率低。
解決方法:
1.給字段station,seq添加聯合唯一索引由于on dumplicate key update只認主鍵或唯一索引。我的表不是根據主鍵id去更新內容,因此采用唯一索引列。(station,seq)構成聯合唯一索引。
alter table tb_name add unique index (station,seq);2.用insert into tb_name () values (),(),() on duplicate key update xx=xx,xx=xx;來一次性更新多條記錄
insert into tb_name (station,seq,data,rectime) values(10, 1, 0, '2017-01-17 08:17:09'), (10, 2, 0, '2017-01-17 08:17:09'),(10, 131, 0, '2017-01-17 08:17:09') on duplicate key update data=values(data),rectime=values(rectime)on duplicate key update語法官方說明:http://docs.Oracle.com/cd/E17952_01/refman-5.1-en/insert-on-duplicate.html它會先執行插入操作,碰到有主鍵或唯一索引的列發生沖突時,對沖突的這一行,執行update操作,更新sql語句中指定的某幾列。如果所有的列都不沖突,此語法和簡單的insert into語法效果一樣。
on duplicate key update 語法的官方說明:http://docs.oracle.com/cd/E17952_01/refman-5.1-en/insert-on-duplicate.htmlreplace和insert所做的工作完全相同,區別是當碰到有主鍵或唯一索引的列發生沖突時,對沖突的這一行,在insert前會對這行數據執行delete操作。效果是這一行中沒有被指定的列會被更新成本列的默認值,如果所有的列都不沖突,此語法和簡單的inset into語法效果一樣。
max_allowed_packet參數的官方說明:http://docs.oracle.com/cd/E17952_01/refman-5.5-en/replication-features-max-allowed-packet.htmlmysql中沒有一次更新紀錄數的限制,但是有sql語句長度的限制。如果需要執行超長的sql語句,需要調整max_allowed_packet這個配置參數。
新聞熱點
疑難解答