insert into select语句在触发器中的运用
这是一个触发器的,达到的效果就是,当tywdeptcourse表添加数据时,根据表中部门ID,给该部门的所有员工选课课程表(tywstaffcourse)中添加该门课程。
代码如下:
DELIMITER $$
CREATE TRIGGER trigger_tywdeptcourse_insert AFTER INSERT
ON tywdeptcourse FOR EACH ROW
BEGIN
INSERT INTO tywstaffcourse(STUFFID,COURSEID) SELECT ID,new.COURSEID FROM tsystaff WHERE DEPTID = new.DEPTID;
END $$
TYWPOSTCOURSE 当该表添加一条数据时,根据表中岗位ID,
给该所有具有该岗位员工的选课课程表(TYWSTAFFCOURSE)中添加该门课程。
DELIMITER $$
CREATE TRIGGER trigger_tywpostcourse_insert AFTER INSERT
ON tywpostcourse FOR EACH ROW
BEGIN
INSERT INTO tywstaffcourse(STUFFID,COURSEID) SELECT ID,new.COURSEID FROM tsystaff WHERE POSTID = new.POSTID;
END $$
当员工岗位发生变化时,将员工新的岗位的课程,由岗位课程关系(TYWPOSTCOURSE)中取出该岗位的课程,将员工选课课程表(TYWSTAFFCOURSE)没有此门课程的数据插入。
DELIMITER $$
CREATE TRIGGER trigger_tsystaff_update AFTER UPDATE ON tsystaff FOR EACH ROW
BEGIN
DECLARE cnt INT;
SET cnt =(SELECT COUNT(COURSEID) FROM tywpostcourse WHERE POSTID = new.POSTID AND COURSEID NOT IN (SELECT COURSEID FROM tywstaffcourse WHERE STUFFID = new.STUFFID));
IF cnt > 0 THEN
INSERT INTO tywstaffcourse(STUFFID,COURSEID) SELECT new.STUFFID,COURSEID
FROM (SELECT COURSEID FROM tywpostcourse WHERE POSTID = new.POSTID AND
COURSEID NOT IN (SELECT COURSEID FROM tywstaffcourse WHERE STUFFID = new.STUFFID));
END IF;
END $$
以下内容感谢菜鸟教程:https://www.runoob.com/sql/sql-insert-into-select.html
SELECT INTO
从一个表复制数据,然后把数据插入到另一个新表中。
创建 users表的的备份复件:
SELECT *
INTO users_copy
FROM users;
只复制一些列插入到新表中:(复制表2的name、age列到表1)
SELECT name, age
INTO table1
FROM table2;
只复制所有列到新表中:(根据条件复制)
SELECT *
INTO table1
FROM table2
WHERE id='001';
复制多个表中的数据插入到新表中:
SELECT table1.name, table2.age, table2.gender
INTO table3
FROM table1
LEFT JOIN table2
ON table1.t1_id=table2.t2_id;
提示:SELECT INTO 语句可用于通过另一种模式创建一个新的空表。
只需要添加促使查询没有数据返回的 WHERE 子句即可:
SELECT *
INTO newtable
FROM table1
WHERE 1=0;
INSERT INTO SELECT
从一个表复制数据,然后把数据插入到一个已存在的表中。目标表中任何已存在的行都不会受影响。
复制 "apps" 中的数据插入到 "Websites" 中:
INSERT INTO Websites (name, country)
SELECT app_name, country FROM apps;
只复 QQ 的 APP 到 "Websites" 中:
INSERT INTO Websites (name, country)
SELECT app_name, country FROM apps
WHERE id=1;
区别
select into from 和 insert into select 都是用来复制表,两者的主要区别为: select into from 要求目标表不存在,因为在插入时会自动创建;insert into select from 要求目标表存在。
- 复制表结构及其数据:
create table table_name_new as select * from table_name_old - 只复制表结构:
create table table_name_new as select * from table_name_old where 1=2;
或者:
create table table_name_new like table_name_old - 只复制表数据:
如果两个表结构一样:
insert into table_name_new select * from table_name_old
如果两个表结构不一样:
insert into table_name_new(column1,column2…) select column1,column2… from table_name_old
稍微整理一下 select into from 和 insert into select 的理解层面的区别
-
select into from :将查询出来的数据整理到一张新表中保存,表结构与查询结构一致。
-
select *(查询出来的结果) into newtable(新的表名)form where (后续条件)
即,查询出来结果—>复制一张同结构的空表—>将数据拷贝进去。 -
insert into select :为已经存在的表批量添加新数据。
-
insert into (准备好的表) select *(或者取用自己想要的结构)frome 表名 where 各种条件
即,指定一张想要插入数据的表格—>对数据进行加工筛选—>填入一张准备好的表格。