这时问题出现了,有人数据库连接不上了,可见这严重性,已经影响到其他人的使用了!
文章插图
于是我组长来帮我处理了,想着 kill 掉我的
navicat
,但是 kill 掉还是没效果,毕竟这个 SQL 已经在执行了 。我:能不能重启这个 MySQL 服务?
组长一波连环炮过来了
组长:重启?你知道这个 MySQL 有多少人在用吗?又不只是我们在用,你重启其他人怎么搞?
我哑口无言,心里非常忐忑,想着闯祸了,GG,就看着他操作 。没过多久,经过他的一顿操作,终于解决了这个问题 。我的心里的一块悬着的大石终于放下了,还好解决了 。组长牛逼,救世主!
我:如何解决的?
组长:将这个事务回滚解决的,你更新的 SQL 怎么写的?(努力回想)
于是写出了上面写的 SQL:
UPDATE b AS tb, (SELECT create_time FROM a) AS ta SET tb.create_time = ta.create_time;
组长:你为什么这样写?不应该把子查询写在 SET tb.create_time
后面吗?我:对啊,我一开始就是把这个子查询写在它后面的,但是提示我语法错误,我就换了一种写法 。
组长:那你写写你说提示错误的 SQL 。
于是我又丢出来一个 SQL:
UPDATE b SET create_time = (SELECT create_time FROM a);
实际上,这条 SQL 也是不行的,子查询返回的结果不止一行,而当前 SET 是更新某一行的 。正确的写法是:
UPDATE b AS tbSET create_time = (SELECT create_time FROM a AS ta WHERE tb.id = ta.id AND tb.name = ta.name)WHERE tb.id = (SELECT tb.id FROM a AS ta WHERE tb.id = ta.id AND tb.name = ta.name)
文章插图
博客园-SQL把一个表中数据更新到另一个表的多种方法最后组长深思,你 B 表已经有 2 万多条记录了,A 表也有 2 万多条记录,你这样更新,每一次都需要子查询查出 A 表的 2 万多条记录,B 也有 2 万多条记录,这样成笛卡尔积了,你知道什么是笛卡尔积吧?2 万 × 2 万 = 4 亿的记录行了,难怪这么久 。
总结情况:漏了某一个字段 X,需要将 A 表的这个字段列值更新到 B 表
条件:A 中的 id 字段的值等于 B表中的 id 字段的值 且 A 中的 name 字段的值等于 B 中 name 字段的值(条件为什么这样写?) 。
条件这样写主要是因为 表和表之间的关联关系 可能有多个字段,此处只选二个字段,多个依此类推 。操作:
- 一张表的数据插入到另一张表,可以这样写:
INSERT INTO 目标表(字段1, 字段2, ...) SELECT 字段1, 字段2, ... FROM 来源表 WHERE 条件;
- 批量更新一张表的某个字段到另一张表,那么 SQL 可以类似这样写:
UPDATE b AS tbSET create_time = (SELECT create_time FROM a AS ta WHERE tb.id = ta.id AND tb.name = ta.name)WHERE tb.id = (SELECT tb.id FROM a AS ta WHERE tb.id = ta.id AND tb.name = ta.name)
所谓洗数据:在我的理解中,就是把旧数据,按照新数据的规则把旧数据不正确的值修改正确,同时把这些旧数据插入到新数据中,成为新数据 。举个例子,A 表中的 province_id,值为 10 代表 广东,而 B 表中的 province_id,值为 19 代表 广东,把 A 表中的数据插入到 B 表的过程中,把值为 10 修改为 19,这样插入的数据才能在 B 表中正确表示 广东,这个过程就是「洗数据」,当然,也可以在插入后再修改,不管过程是怎样,最终能把数据的值修改正确,就是洗数据!教训: