这一章节所用到的表,还是上一章的 user 进行讲解。
把一些记录都给删除了, 只留下这六条记录。
一. 更新数据命令 update 关键字
更新数据所用命令
update 表名 set 列名1=属性值1,列名2=属性值2...列名n=属性值n [where 条件语句]
其中,老蝴蝶提示,一定要注意几点:
1 . 修改更新数据时, 用的是 set 设置 关键字。
2 . 列名和及后面对应的属性值 一定要对应,包括数据类型,长度。
3 . 可以一次性更新记录表里面的 多个属性值, 多个属性值之间是用 ,进行分隔。
4 . 更新时, 最好一定要加上 where 条件语句, 表示选择性更新。 如果不加的话,就表示更新全部的记录。 更新全部记录,很吓人的。
二. 更新一条记录的一个字段值
更新一条记录,如何唯一确定一条记录呢? 用主键。 后面的where 语句,用id=? 来进行确定。
更新单个字段值一般有以下两个情况:
1 . 更新成一个全新的值,与原来的值没有任何关联。
2 . 更新成一个与原来的值有关联的新值。 即将原来的值,通过某种规律,公式 变化成一个新的值。
二.一 更新成一个全新的值
如 将 id=1 的记录 的描述 description 更新成 ‘佛学爱好者’。 原来的值 ‘一个快乐的程序员’ 与现在要更新成的新值 ‘佛学爱好者’ 没有任何关联。
update user set description='佛学爱好者' where id=1;
可以看到:
Rows matched: 1 Changed: 1 Warnings: 0
匹配了一行, 改变了一行, 没有警告。 注意这个结果语句。
二.二 更新成一个与原来的值有关联的值
这种情况很常见, 如 在name字段的开始和末尾加上空格, 如截取name,只保留第一个值,即只留下姓, 如将 age 在原来的基础上 +2, 或者让 工资在原来的基础上增加10%. 这些都是与原来的值有关联的。
为了对这种情况加深印象,老蝴蝶分别 对字符串型的 name 和数字型的 age 分别举例说明。
二.二.一 字符串型 截取 只保留第一个值
将 id=3 的记录, 由原来的 name=‘岳泽霖’ 变成 name=‘岳’. 用 substr() 函数。
update user set name=substr(name,1,1) where id=3;
二.二.二 数字型 +2
将id=4 的年龄 age,在原来的基础上+2.
update user set age=age+2 where id=4;
其中, age=age+2 也可以写成 age+=2 这种形式。
二.三 更新某个字段时的其它情况
二.三.一 更新的值与原来的值相同 (不会报错,匹配但不运行)
如将 id=2的记录,由原来的性别 男 还改变成 男。
update user set sex='男' where id=2;
注意:
Rows matched: 1 Changed: 0 Warnings: 0
匹配了一行, 但改变了0 行,警告 0 行。 也就是说,并没有改变 id=2 这条记录。
所以在 业务开发时,不建议 根据 update 的 改变行数 的返回结果 来确定 是否正确的执行了数据。
即,不能说:
int rowCount=userDao.updateNameById(user); if(rowCount>0){ //正常 }else{ throws new DataBaseException(); }
这样是不太好的。 可以 在改变字段之前,判断一下, 要改变的值是否与数据库中已经存在的值一致。 如果一致,就提示 用户 ‘与原来的值相同,无法修改’ 如果不一致,才进行更新数据库。
二.三.二 更新主键 问题 (会报错)
如将 id=2 的记录 的id 主键,更新换成别的不存在的值,如7。 更新成已经存在的值,肯定会报主键重复的问题。
udpate user set id=7 where id=2;
单个主键时,更新主键会报错。
二.三.三 更新导致约束问题 (会报错)
如name 是非空约束,将id=1的记录 的name改成 null,
update user set name=null where id=1;
也包括外键约束,唯一约束等。 如果不造成约束问题,是可以正常修改的。
二.三.四 更新数据类型不一致(会报错)
如 age 是数字型, 将id=1的记录 的age 变成 ‘年龄’
update user set age='年龄' where id=1;
注意:
Rows matched: 0 Changed: 0 Warnings: 0
没有行 匹配到, 没有行改变, 也没有错误。