11. 数据处理之增删改
1. 插入数据
使用 INSERT 语句向表中插入数据。
方式1:VALUES的方式添加
为表的所有字段按默认顺序插入数据
值列表中需要为表的每一个字段指定值,并且值的顺序必须和数据表中字段定义时的顺序相同。
INSERT INTO departments
VALUES (70, 'Pub', NULL, 1700);
为表的指定字段插入数据
为表的指定字段插入数据,就是在INSERT语句中只向部分字段中插入值,而其他字段的值为表定义时的默认值。
在 INSERT 子句中随意列出列名,但是一旦列出,VALUES中要插入的value1,....valuen需要与column1,...columnn列一一对应。如果类型不同,将无法插入,并且MySQL会产生错误。
INSERT INTO departments(department_id, department_name)
VALUES (80, 'IT');
同时插入多条记录
INSERT INTO table_name(column1 , column2, …, columnn)
VALUES
(value1 ,value2, …, valuen),
(value1 ,value2, …, valuen),
……
(value1 ,value2, …, valuen);
多行的INSERT语句 在处理过程中 效率更高 。
使用INSERT同时插入多条记录时,MySQL会返回一些在执行单行插入时没有的额外信息,这些信息的含 义如下:
● Records:表明插入的记录条数。
● Duplicates:表明插入时被忽略的记录,原因可能是这 些记录包含了重复的主键值。
● Warnings:表明有问题的数据值,例如发生数据类型转换
注意:
- VALUES 也可以写成 VALUE ,但是VALUES是标准写法。
- 字符和日期型数据应包含在单引号中。
方式2:将查询结果插入到表中
- 在 INSERT 语句中加入子查询。
- 不必书写 VALUES 子句。
- 子查询中的值列表应与 INSERT 子句中的列名对应。
- emp表中要添加数据的字段的长度不能低于employees表中查询的字段的长度。
INSERT INTO emp(id, name, salary, commission_pct)
SELECT employee_id, last_name, salary, commission_pct
FROM employees
WHERE job_id LIKE '%E%';
如果emp表中要添加数据的字段的长度低于employees表中查询的字段的长度的话,就有添加不成功的风险。
2. 更新数据
使用 UPDATE 语句更新数据。
- 可以一次更新多条数据。
- 如果需要回滚数据,需要保证在DML前,进行设置:SET AUTOCOMMIT = FALSE;
- 使用 WHERE 子句指定需要更新的数据。如果省略 WHERE 子句,则表中的所有数据都将被更新。
-- 同时修改一条数据的多个字段
UPDATE emp
SET hire_date = CURDATE(),salary = 6000
WHERE id = 4;
-- 同时修改多条数据
UPDATE emp
SET salary = salary * 1.2
WHERE NAME LIKE '%a%';
- 更新中的数据完整性错误
-- 错误代码:1452;Cannot add or update a child row
UPDATE employees
SET department_id = 55 -- 不存在 55 号部门
WHERE department_id = 110;
3. 删除数据
使用 DELETE 语句从表中删除数据
DELETE FROM table_name [WHERE <condition>];
table_name指定要执行删除操作的表;“[WHERE ]”为可选参数,指定删除条件,如果没有WHERE子句,DELETE语句将删除表中的所有记录。
- 删除中的数据完整性错误
-- 由于约束设定,不能删除:Cannot delete or update a parent row
DELETE FROM departments
WHERE department_id = 60;
DML操作默认情况下,执行完以后都会自动提交数据。如果希望执行完以后不自动提交数据,则需要使用 SET autocommit = FALSE.
4. ON DUPLICATE KEY UPDATE
使用 on duplicate key update 进行插入操作时,MySQL会对照插入数据和表数据,若唯一索引或主键重复,MySQL会自动进行更新操作。
例如:
INSERT INTO t1 (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE
a=a,b=b,c=c;
若其中a是唯一索引或主键,则以上sql相当于:
UPDATE t1 SET b=2,c=3 WHERE a=1;
注意与一般update语句不同的是这种方式会使id自增(即使没有新纪录)
若其中a,b都为唯一索引,则sql相当于:
UPDATE t1 SET c=3 WHERE a=1 OR b=2 LIMIT 1;
如果a=1 or b=2 匹配了多条数据,那么只会更新一行。所以我们需要避免在多个唯一索引里面使用on duplicate key update语法。
使用 ON DUPLICATE KEY UPDATE 需要注意:
- 尽量保证插入的数据只涉及一个唯一索引或主键
- 不能跟where条件
- 表中存在多个唯一索引时可能会造成死锁
5. MySQL8新特性:计算列
简单来说就是某一列的值是通过别的列计算得来的。例如,a列值为1、b列值为2,c列不需要手动插入,定义a+b的结果为c的值,那么c就是计算列,是通过别的列计算得来的。
在MySQL 8.0中,CREATE TABLE 和 ALTER TABLE 中都支持增加计算列。
CREATE TABLE test1(
a INT,
b INT,
c INT GENERATED ALWAYS AS (a + b) VIRTUAL  #字段c即为计算列
);
INSERT INTO test1(a,b)
VALUES(10,20);
SELECT * FROM test1;-- a:10;b:20;c:30
UPDATE test1
SET a = 100;-- a:100;b:20;c:120

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号