一、使用 DML 语句

DML(Data Manipulation Language 数据操纵语言) 可以在下列条件下执行:

  • 向表中插入数据
  • 修改现存数据
  • 删除现存数据

事务是由完成若干项工作的DML语句组成的

二、向表中插入数据

2.1.INSERT 语句语法

使用 INSERT 语句向表中插入数据:

数据处理之增删改_外键约束

使用这种语法一次只能向表中插入一条数据

2.2.插入数据

  • 为每一列添加一个新值
  • 按列的默认顺序列出各个列的值
  • 在INSERT 子句中随意列出列名和他们的值
  • 字符和日期型数据应包含在单引号中
INSERT INTO departments(department_id,department_name,manager_id,location_id)
VALUES (280,'Pub',100,1700)

INSERT INTO employees(employee_id,last_name,email,hiredate,job_id)
VALUES (300,'Augus','augus@163.com',DATE_FORMAT('2023/9/11','%Y-%m-%d'),'SA_REP')

2.3.向表中插入空值

  • 隐式方式: 在列名表中省略该列的值。

数据处理之增删改_数据_02

  • 显示方式: 在VALUES子句中指定空值。

数据处理之增删改_外键约束_03

2.4.插入指定的值

NOW()函数:记录当前系统的日期和时间。

数据处理之增删改_数据_04

INSERT INTO employees 
(employee_id,first_name,last_name,email,phone_number,hiredate,job_id,salary,commission_pct,manager_id,department_id)
VALUES (301,'Louis','Popp','qewqewqw@163.com','15512344321',NOW(),'AC_ACCOUNT',6986,NULL,205,100)

2.5.从其它表中拷贝数据

在 INSERT 语句中加入子查询。

将employees表中部门ID为90的员工信息查询出来,插入到emp2表中

INSERT INTO emp2 
SELECT * FROM employees WHERE department_id = 90;

注意:

  • 不必书写 VALUES 子句。
  • 子查询中的值列表应与 INSERT 子句中的列名对应

2.6.同时插入多行数据

INSERT INTO employees (employee_id,first_name,last_name,email,phone_number,job_id,salary,commission_pct,manager_id,department_id,hiredate) VALUES
(302,'Steven','K_ing','SKING','515.123.4567','AD_PRES',24000.00,NULL,NULL,90,'1992-04-03 00:00:00'),
(303,'Neena','Kochhar','NKOCHHAR','515.123.4568','AD_VP',17000.00,NULL,100,90,'1992-04-03 00:00:00'),
(304,'Lex','De Haan','LDEHAAN','515.123.4569','AD_VP',17000.00,NULL,100,90,'1992-04-03 00:00:00'),
(305,'Alexander','Hunold','AHUNOLD','590.423.4567','IT_PROG',9000.00,NULL,102,60,'1992-04-03 00:00:00'),
(306,'Bruce','Ernst','BERNST','590.423.4568','IT_PROG',6000.00,NULL,103,60,'1992-04-03 00:00:00')

如果是给表中所有字段都插入数据,则字段名可以省略不写

INSERT INTO employees 
VALUES 
(308,'Louis','Popp','qewqewqw@163.com','15512344321','AC_ACCOUNT',6986,NULL,205,100,NOW()),
(309,'Louis','Popp','qewqewqw@163.com','15512344321','AC_ACCOUNT',6986,NULL,205,100,NOW()),
(310,'Louis','Popp','qewqewqw@163.com','15512344321','AC_ACCOUNT',6986,NULL,205,100,NOW()),
(311,'Louis','Popp','qewqewqw@163.com','15512344321','AC_ACCOUNT',6986,NULL,205,100,NOW()),
(312,'Louis','Popp','qewqewqw@163.com','15512344321','AC_ACCOUNT',6986,NULL,205,100,NOW())

三、更新表中数据

3.1.UPDATE 语句语法

使用 UPDATE 语句更新数据:

数据处理之增删改_插入数据_05

注意:

  • 可以一次更新多条数据。
  • 如果需要回滚数据,需要保证在DML前,进行 设置:SET AUTOCOMMIT = FALSE; 如果需要回滚则执行 ROLLBACK 命令,回滚事务即可

3.2.更新数据

使用 WHERE 子句指定需要更新的数据。

数据处理之增删改_插入数据_06

如果省略 WHERE 子句,则表中的所有数据都将被更新

数据处理之增删改_外键约束_07

3.3.更新中的数据完整性错误

UPDATE employees
SET department_id=56
WHERE department_id = 110

执行SQL会报错:

1452 - Cannot add or update a child row: a foreign key constraint fails (myemployees.employees, CONSTRAINT dept_id_fk FOREIGN KEY (department_id) REFERENCES departments (department_id))

报错的原因是因为在执行UPDATE语句时,将department_id从110改为56,但是表departments中并没有department_id为56的记录(不存在56号部门),因此违反了外键约束。外键约束要求在更新或插入数据时,被参考的外键值必

四、从表中删除数据

4.1.DELETE 语句

使用 DELETE 语句从表中删除数据

数据处理之增删改_数据_08

4.2.删除数据

  • 使用 WHERE 子句删除指定的记录:

数据处理之增删改_外键约束_09

  • 如果省略 WHERE 子句,则表中的全部数据将被删除

数据处理之增删改_外键约束_10

4.3.删除中的数据完整性错误

DELETE FROM departments
WHERE department_id = 60

执行上面的SQL会报错

数据处理之增删改_外键约束_11

报错的原因是因为在执行DELETE语句时,删除了departments表中department_id为60的记录,而employees表中仍然存在department_id为60的记录,这违反了外键约束。外键约束要求在删除或更新数据时,被参考的外键值必须在关联表中存在,否则会触发约束失败的错误。