mysql中通过相关表更新数据测试有什么误区?

分类:编程技术 时间:2024-02-20 16:02 浏览:0 评论:0
0
本文向大家介绍如何测试MySQL中通过相关表更新数据的误区。内容非常详细。有兴趣的朋友可以参考一下。希望对大家有所帮助。

关于更新关联表的写法,存在很多误解。我自己以前也经常犯错误......
一般的写法如下:
update test1 set name =(select name from test2 where test1.id=test2.id);
update test1 a,test2 b set a.name=b.name where a.id=b.id;
update test2 set test2.name =(select name from test1 where test1.id=test2.id)其中存在(从 test1 中选择 *,其中 test1.id=test2.id);

一般来说这三种写法都可以,只要test1和test2中name和id字段唯一...
下面讨论一下改表的情况以及相关的分别表:
首先讨论相关表重复的情况:

mysql> select * 来自 test1;
+------+------+
|编号 |姓名 |
+-- ----+------+
| 1 | k1 |
| 2 | k2 |
| 3 | k3 |
| 4 | kkk |
| 4 | k4 |
| 4 | k4 |
+------+------+
集合中的 6 行(0.00 秒)

mysql> select * from test2;
+------+------+
|编号 |姓名 |
+------+------+
| 1 |第2222章2 |第2222章3 |第2222章4 |第2222章= (select test1.name from test1 where test1.id=test2.id) 
 -> ;
错误 1242 (21000): 子查询返回超过 1 行


mysql> update test2 a,test1 b set a.name=b.name where a.id=b.id;
查询正常,4行受影响(0.01秒)
行匹配:4更改: 4 个警告: 0

mysql> select * from test2;
+------+------+
|编号 |姓名 |
+------+------+
| 1 | k1 |
| 2 | k2 |
| 3 | k3 |
| 4 | kkk |
+------+------+
集合中有 4 行(0.00 秒)

test1 有多个记录表中id=4的ds...并且值不一致。此时,用test1作为驱动表,是不可取的。无论使用什么语法,要么报错,要么只驱动驱动表重复值的第一个值...


< br/>
然后我们讨论变化的表有冗余值的情况
冗余值是相对于变化条件而言的。比如只改变了ID1-4...而id=5也有类似的情况;
mysql> select * from test2;
+------+---- ---+
|编号 |姓名 |
+---- --+---------+
| 1 | k1 |
| 2 | k2 |
| 3 | k3 |
| 4 | kkk|
| 5 | gopeng |
+------+---------+
集合中的 5 行(0.00 秒)

mysql > select * from test1;
+------+------+
|编号 |姓名 |
+------+---- --+
| 1 | k1 |
| 2 | k2 |
| 3 | k3 |
+-----+--------+
集合中的 3 行(0.00 秒)

mysql> update test2 set test2.name= (硒从 test1 中选择名称,其中 test1.id=test2.id);
查询正常,受影响的 2 行(0.01 秒)
匹配的行:5 已更改:2 警告:0

mysql > 从 test2 中选择 *;
+------+---- --+
|编号 |姓名 |
+------+------+
| 1 | k1 |
| 2 | k2 |
| 3 | k3 |
| 4 |空|
| 5 | NULL |
+-----+--------+
集合中 5 行(0.00 秒)


如您所见,无条件更新会导致冗余数据变为null。
mysql> select * from test2;
+------+------+
|编号 |姓名 |
+------+------+
| 1 | rrr |
| 2 | rrr |
| 3 | rrr |
| 4 | rrr |
| 5 | rrr |
+--- ---+------+
集合中 5 行(0.00 秒)


mysql> 更新 test2 设置 test2 .name=(select name from test1 where test1 .id=test2.id) where contains (select * from test1 where test1.id=test2.id);
查询正常,受影响 3 行(0.01 秒)
匹配行:3 更改:3 警告:0

mysql> select * from test2;
+- -- ---+------+
|编号 |姓名|
+------+------+
| 1 | k1 |
| 2 | k2 |
| 3 | k3 |
| 4 | rrr |
| 5 | rrr |
+------+-- ----+
集合中有 5 行(0.00 秒)


所以要注意条件更改关联时:
1.驱动程序表不能有重复的值。关联表作为参考值,不能有重复,否则取值时不知道取哪个值
2.如果更改的表中有冗余值,必须添加条件,否则,将没有关联数据。会改为null;

这里分享一下mysql中通过相关表更新数据的误区。希望以上内容能够对大家有所帮助。在帮助下,您可以了解更多信息。如果您觉得文章不错,可以分享出去,让更多的人看到。

1. 本站所有资源来源于用户上传或网络,仅作为参考研究使用,如有侵权请邮件联系站长!
2. 本站积分货币获取途径以及用途的解读,想在本站混的好,请务必认真阅读!
3. 本站强烈打击盗版/破解等有损他人权益和违法作为,请各位会员支持正版!
4. 编程技术 > mysql中通过相关表更新数据测试有什么误区?

用户评论