一、sql update语句
update主要用于更新表中已存在的记录,其语法如下:
UPDATE table_name
SET column1=value1,column2=value2,…
WHERE some_column=some_value
update websites set alexa='500',country='CN' where name='aka';
注意:在使用update语句进行表记录更新时应该格外小心,如果省略where子句,将直接导致整个表数据全部更新。在工作时执行没有where子句的update要慎重。
为了避免这种情况的出现,在 MySQL 中可以通过设置 sql_safe_updates 这个自带的参数来解决,当该参数开启的情况下,你必须在update 语句后携带 where 条件,否则就会报错。
set sql_safe_updates=1;
二、sql delete语句
delete语句用于删除表中的行,其语法如下:
DELETE FROM table_name
WHERE some_column=some_value;
delete from websites where name='test';
注意:你可以使用delete from table_name 来删除表中所有记录,但这意味着表结构仍然存在,属性及索引将保持不变。与drop直接删除不同。
三、sql语句中三个删除的具体区别
①
drop table_name;//将这个表完全删除包括表结构,且数据不可回滚恢复。
②
truncate table_name;//删除表内容,不包括结构及索引,且数据不可回滚恢复。
③
delete table_name;//删除表内容,不包括结构及索引,数据可回滚恢复。
总结:
相同点
truncate 和不带 where 子句的 delete, 以及 drop 都会删除表内的数据。
不同点:
a.truncate 和 delete 只删除数据不删除表的结构(定义) ,drop 语句将删除表的结构被依赖的约束(constrain), 触发器(trigger), 索引(index); 依赖于该表的存储过程/函数将保留, 但是变为 invalid 状态。
b.delete 语句是 dml, 这个操作会放到 rollback segement 中, 事务提交之后才生效; 如果有相应的 trigger, 执行的时候将被触发。 truncate, drop 是 ddl, 操作立即生效, 原数据不放到 rollback segment 中, 不能回滚。 操作不触发 trigger。
c.delete 语句不影响表所占用的 extent, 高水线(high watermark)保持原位置不动。 显然 drop 语句将表所占用的空间全部释放 。 truncate 语句缺省情况下见空间释放到 minextents 个 extent, 除非使用 reuse storage; truncate会将高水线复位(回到最开始)。
d.速度:一般来说: drop > truncate > delete 。
e.安全性: 小心使用 drop 和 truncate, 尤其没有备份的时候。否则哭都来不及。使用上, 想删除部分数据行用 delete, 注意带上 where 子句。 回滚段要足够大。想删除表, 当然用 drop。想保留表而将所有数据删除。如果和事务无关, 用 truncate 即可。 如果和事务有关, 或者想触发 trigger, 还是用 delete。
如果是整理表内部的碎片, 可以用 truncate 跟上 reuse stroage, 再重新导入/插入数据。