Mysql 基础(十二) 数据的更新

数据的更新

生命不可能有两次,但许多人连一次也不善于度过。——吕凯特

数据的插入(INSERT 语句的使用方法)

学习重点

  • 使用 INSERT 语句可以向表中插入数据(行)原则上,INSERT 语句每次执行一行数据的插入

  • 将列名和值用逗号隔开,分别括在()内,这种形式称为清单

  • 对表中所有列进行 INSERT 操作时可以省略表名后的列清单

  • 插入 NULL 时 需要在 VALUES 子句的值清单中写入 NULL

  • 可以为表中的列设定默认值(初始值),默认值可以通过在 CREATE TABLE 语句中为列设置 DEFAULT 约束来设定

  • 插入默认值可以通过两种形式实现,即在 INSERT 语句的 VALUES 子句中指定 DEFAULT 关键字(显示方法)或者省略列清单(隐式方法)

  • 使用 INSERT…SELECT 可以从其他表中复制数据

什么是 INSERT

INSERT 语句的基本语法


INSERT INTO <表名> (列1,列2, 列3,....) VALUES (值1,值2,值3,....);
  • 实践操作

INSERT INTO ProductIns (product_id, product_name, product_type,sale_price, purchase_price, regist_date) VALUES ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');

由于 product_id(商品编号)和 product_name 列(商品名称)是字符型,所以插入数据需要像 ‘0001’ 是字符型所以需要单引号括起来

多行插入 INSERT

  • 多行 VALUES 需要用()和逗号间隔

INSERT INTO ProductIns VALUES ('0002', '打孔器','办公用品', 500, 320, '2009-09-11'),('0003', '运动T恤','衣服', 4000, 2800, NULL),('0004', '菜刀','厨房用具', 3000, 2800, '2009-09-20');

对全表的数据插入的时候可以省略表名后的列清单。这时 VALUES 子句的值会默认从左到右的顺序赋给每一列。

插入 NULL

INSERT 语句中想给某一列赋予 NULL 值,可以直接在 VALUES 子句的值清单中写入 NULL,比如


INSERT INTO ProductIns (product_id, product_name, product_type,sale_price, purchase_price, regist_date) VALUES ('0006', '叉子','厨房用具', 500, NULL, '2009-09-20');

但是想要插入 NULL 的列一定不能设置 NOT NULL 约束,向设置了 NOT NULL 约束的列中插入 NULL 时,INSERT 语句会报错,导致数据插入失败

插入失败指的是希望通过 INSERT 语句插入的数据无法正常插入到表中,但是之前插入的数据并不会遭到破坏

插入默认值

  • 我们还可以向表中插入默认值(初始值).可以通过在创建表的 CREATE TABLE 语句中设置 DEFAULT 约束来设定默认值

CREATE TABLE ProductIns
(product_id CHAR(4) NOT NULL,
(略)
sale_price INTEGER DEFAULT 0, -- 销售单价的默认值设定为0;
(略)
PRIMARY KEY (product_id));
  • 通过显式方法插入默认值

INSERT INTO ProductIns (product_id, product_name, product_type,sale_price, purchase_price, regist_date) VALUES ('0007','擦菜板', '厨房用具', DEFAULT, 790, '2009-04-28');
  • 通过隐式方法插入默认值

插入默认值也可以不使用 DEFAULT 关键字,只要在列清单和 VALUES 中省略设定了默认值的列就可以了


INSERT INTO ProductIns (product_id, product_name, product_type,purchase_price, regist_date) VALUES ('0007', '擦菜板', '厨房用具',790, '2009-04-28');

上面那个例子就没有了默认值那个列 插入的值也没有默认值

从其他表中复制数据


INSERT INTO ProductCopy (product_id, product_name, product_type,sale_price, purchase_price, regist_date)
SELECT product_id, product_name, product_type, sale_price,purchase_price, regist_date FROM Product;

INSERT 语句的 SELECT 语句中可以使用 WHERE 子句或者 GROUP BY 子句等语法

数据的删除(DELETE 语句的使用方法)

学习重点

  • 如果想整个表全部删除,可以使用 DROP TABLE 语句 如果只想删除表中全部数据,需要使用 DELETE 语句

  • 如果想删除部分数据行,只需要 WHERE 子句中书写对象数据的条件即可
    通过 WHERE 子句指定删除对象的 DELETE 语句称为搜索型 DELETE 语句

DROP TABLE 和 DELETE 语句

  • DROP TABLE 可以将表完全删除

  • DELETE 语句会留下表(容器) 而删除表中的全部数据

DELETE 基本语法


DELETE FROM Product

如果忘写了 FROM 或者写了多余的列名 都会出错

指定删除对象的 DELETE 语句(搜索型 DELETE)

  • 基本语法

DELETE FROM 表名 WHERE <条件>;
  • 实例化

DELETE FROM Product WHERE sale_price >=400;
  • 在比如删除价格大于等于 4000 日元的数据

DELETE FROM Product WHERE sale_price >= 4000;

DELETE 语句中不能使用 GROUP BY ,ORDER BY ,HAVING 语句,而且只能使用 WHERE 子句

舍弃和删除 TRUNCATE


TRUNCATE <表名>

TRUNCATE 只能删除表中的全部数据,而不能通过 WHERE 来删除

TRUNCATE 删除的速度比 DELETE FROM 快了很多

数据的更新(UPDATE 语句的使用方法)

UPDATE 语句的基本用法

  • 基本语法 UPDATE SET

UPDATE <表名> SET <列名> = <表达式>;
  • 实例化

UPDATE Product SET regist_date = '2009-10-10';

指定条件的 UPDATE 语句


UPDATE <表名> SET <列名> = <表达式> WHERE <条件>;
  • 实例化

UPDATE Product SET sale_price = sale_price * 10 WHERE product_type = '厨房用具';

使用 NULL 进行更新

  • 使用 UPDATE 将列更新为 NULL

UPDATE Product SET regist_date = NULL WHERE product_id = '0008';

多列更新

  • UPDATE 语句的 SET 子句支持同时将多个列作为更新对象.

UPDATE Product
SET sale_price = sale_price * 10,
purchase_price = purchase_price / 2
WHERE product_type = '厨房用具';
  • 第二种方法

UPDATE Product
SET (sale_price, purchase_price) = (sale_price * 10, 
purchase_price / 2)
WHERE product_type = '厨房用具';

一般都会选择第一种方法

事务

  • 事务是需要在同一个处理单元中执行的一系列更新处理的集合。通过使用事务,可以对数据库中的数据更新处理的提交和取消进行管理

  • 事务处理的终止指令包括 COMMIT(提交处理)和 ROLLBACK(取消处理) 两种

  • DBMS 的事务具有 原子性,一致性,隔离性,持久性(四种特性) 将四种首字母结合起来,统称为 ACID 特性

有的时候又需要对一列进行增加 又得对另外的列进行减少 把一次需要进行 2 条以上的语句,我们称为事务。事务就需要在同一个处理单元执行的一系列更新处理的集合

事务简单来说一句话

没有执行到 COMMIT,所有的操作都能还原.回滚

创建事务

  • 基础语法

事务开始语句;
   DML语句1;
   DML语句2;
   DML语句3;
   ......
事务结束语句(COMMIT或者ROLLBACK);
  • 事务开始的语句

START TRANSACTION
  • 事务结束的语句

COMMIT 提交


COMMIT;
或
ROLLBACK;
  • 实例化

START TRANSACTION;
-- 将运动T恤的销售单价降低1000日元
UPDATE Product
SET sale_price = sale_price - 1000
WHERE product_name = '运动T恤';
-- 将T恤衫的销售单价上浮1000日元
UPDATE Product
SET sale_price = sale_price + 1000
WHERE product_name = 'T恤衫';
COMMIT;

ROLLBACK – 取消处理

  • ROLLBACK 是取消事务包含的全部更新处理的结束指令,相当于文件处理中的放弃保存,一旦回滚.数据库就会恢复到事务开始之前的状态.通常回滚并不会像提交那样造成大规模的数据损失

START TRANSACTION;
-- 将运动T恤的销售单价降低1000日元
UPDATE Product
SET sale_price = sale_price - 1000
WHERE product_name = '运动T恤';
-- 将T恤衫的销售单价上浮1000日元
UPDATE Product
SET sale_price = sale_price + 1000
WHERE product_name = 'T恤衫';
ROLLBACK;

ACID 特性

  • 原子性(Atomicity)

原子性 指在事务结束时,其中所包含的更新处理要么全部执行,要么全部不执行.

  • 一致性(Consistency)

一致性 指的是事务中包含的处理要满足数据库提前设置的约束,如主键约束或者 NOT NULL 等。

比如对于事务来说,这些不合法的 SQL 会被回滚.也就是说这些 SQL 处理会被取消,不会被执行.

一致性也叫完整性

比如 事务里面有 4 条操作语句 1,2 能执行但是 3 报错了,3 就不执行了,4 会继续执行

  • 隔离性(Isolation)

隔离性指的是不同事务之间互不干扰的特性。事务之间不会互相嵌套.

比如即使某个事务向表中添加了记录,在没有提交之前,其他事务是看到不到新添加的

  • 持久性(Durability)

持久性也可以成为耐久性,也指的是在事务结束后,DBMS 能够保证该时间点的数据状态会保存的特性。即使由于系统故障导致数据丢失,数据库也能通过一些手段恢复。

通常就是把事务的执行记录保存在硬盘等存储介质中(一般叫做日志),当故障发生后,可以通过日志恢复到故障发生前的状态


文章作者: 雾烟云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 雾烟云 !
  目录