mysql的insert for update用法

本文介绍了在面对大量历史数据迁移时,如何通过SQL脚本实现高效的数据转移与更新。特别是针对MySQL中的INSERT...ON DUPLICATE KEY UPDATE语句进行了详细解析,并提供了一个具体的案例来展示其在批量更新场景下的应用。

  好久没写博客了,洗完澡一时兴起,小写一篇记录sql知识点吧。

       由于之前公司业务的变更,需要做一个历史数据表数据迁移到新建的数据表中,刚被分配到这个任务时,马上打开历史数据表的相关结构,一看懵逼了。需求大概是把原来的几百张数据库表(里面大概有三四类表,由于数据量太大,都进行一定规则的分表)迁移到新建的数据库表(也是采用一定规则分表)。

   第一阶段,采用insert语法批量添加数据。

       由于数据表数据量太大了,业务变更也比较复杂,所以采用脚本形式实现数据迁移。

  第二阶段,这是重点,采用 insert for update用法

  原因是由于新表的某些列并不能在插入的时候直接拼接,由于后面再进行更新。一开始使用常规方法,一条条进行update操作,发现如果一条条进行更新操作的话,会对数据库进行大量的访问,服务器的负载和访问量会压力很大,这样是很不合理的,后面就想通过批量更新的方法进行操作。

  示例,数据表为test,数据如下:

id

a

b

1

a是1

b是1

2

a是2

b是2

现在批量更新id为1的a列数据为“a是11”,id为2的a列数据为“a是22”。

执行的sql为

# INSERT INTO test VALUES(1,’a是11’,’b是1’),(2,’a是22’,’b是2’) ON DUPLICATE KEY UPDATE a=VALUES(a);

 

总结:mysql中的”insert into tablename values() on duplicate key update columnName = valueName;” 用于批量更新数据库表的列数据是比较适用的。

### MySQL 中 `INSERT` 和 `UPDATE` 语句的使用方法 #### 插入数据:`INSERT` 在MySQL中,`INSERT`语句用于向表中添加新的记录。此操作可以通过多种方式执行,具体取决于要插入的数据量以及来源。 - **插入单行数据** 当需要插入一条新纪录到指定表时,语法如下: ```sql INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); ``` 例如,在employees表中增加一位名为'Alice Smith'的新员工,并将其分配给部门ID为101的部门[^4]。 ```sql INSERT INTO employees (first_name, last_name, department_id) VALUES ('Alice', 'Smith', 101); ``` - **批量插入多条记录** 如果一次性想要插入多个值,则可以在VALUES关键字后面跟上由逗号分隔的一组或多组括起来的具体数值列表。 ```sql INSERT INTO customers (name, email) VALUES ('John Doe', 'john@example.com'), ('Jane Doe', 'jane@example.com'); ``` - **基于查询结果插入数据** 还可以通过子查询的方式将其他表里的某些符合条件的数据复制过来作为新记录的一部分。 ```sql INSERT INTO archive_orders (order_id, customer_id, order_date) SELECT order_id, customer_id, order_date FROM orders WHERE order_date < '2023-01-01'; ``` #### 更新已有数据:`UPDATE` 而`UPDATE`命令则是用来修改已存在于某个特定条件下的现有记录的内容。它可以作用于单一字段或是整个行内的所有属性;甚至能够影响整张表里满足一定标准的所有匹配项。 基本形式如下所示: ```sql UPDATE table_name SET column1=value1,column2=value2,... WHERE condition; ``` 这里的关键在于WHERE子句部分——它决定了哪些具体的行会被改变。如果没有给出任何限定的话,默认情况下会针对全部记录实施变更动作[^3]。 举个例子来说,假设现在有一个需求是要把所有属于销售部(sales department)成员的名字都改为大写字母表示的形式,那么就可以这样写SQL表达式: ```sql UPDATE employees SET first_name=UPPER(first_name),last_name=UPPER(last_name) WHERE department='Sales'; ``` 值得注意的是,尽管两者都是用来处理数据库内存储的信息单元,但是它们之间存在着明显的差异之处。主要体现在功能定位方面:前者侧重于引入全新的实体对象进入系统之中;后者则更关注对于已经存在的实例进行调整优化工作。 #### 功能区别总结 | 特征 | INSERT | UPDATE | | --- | ------ | -------| | 主要用途 | 向表中新增加一行或多行记录 | 修改现有的某几行或某一列上的内容 | | 影响范围 | 只能创建不存在的东西 | 能够改动既定事实的状态 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值