Oracle中多表插入是一个比较常见的需求。它的意思是对多个表进行插入操作,可以一次性地进行多个插入动作。这样一来,可以减少很多重复性代码的编写,提高代码的复用性。
例如,假设我们现在需要往两个表中插入数据。第一个表是员工表,第二个表是部门表。
CREATE TABLE employee(
id NUMBER(6) NOT NULL,
name VARCHAR2(20) NOT NULL,
SEX VARCHAR2(20) NOT NULL,
age NUMBER(6) NOT NULL,
salary NUMBER(10, 2) NOT NULL,
hiredate DATE NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE department(
id NUMBER(6) NOT NULL,
deptname VARCHAR2(20) NOT NULL,
location VARCHAR2(20) NOT NULL,
PRIMARY KEY(id)
);
INSERT INTO employee(id, name, sex, age, salary, hiredate)
VALUES(1, '张三', '男', 35, 8000, TO_DATE('2018-12-01', 'yyyy-mm-dd'));
INSERT INTO employee(id, name, sex, age, salary, hiredate)
VALUES(2, '李四', '女', 28, 5000, TO_DATE('2019-01-01', 'yyyy-mm-dd'));
INSERT INTO department(id, deptname, location)
VALUES(1, '研发部', '北京');
INSERT INTO department(id, deptname, location)
VALUES(2, '销售部', '上海');
这样我们就已经在两个表中插入了数据。但是如果我们需要在一个事务中往这两个表中插入数据,而且还要保证数据的一致性,这时候就需要使用多表插入。
Oracle中的多表插入语法如下:
INSERT ALL
WHEN 1=1 THEN
INTO employee(id, name, sex, age, salary, hiredate)
VALUES(3, '王五', '男', 25, 6000, TO_DATE('2019-02-01', 'yyyy-mm-dd'))
WHEN 1=1 THEN
INTO department(id, deptname, location)
VALUES(3, '人力资源部', '广州')
SELECT * FROM DUAL;
这个语法可以对多个表进行插入操作,每个插入操作都需要一个WHEN条件,如果满足这个条件,则插入相应的表。注意,这里的WHEN条件不能省略,可以使用1=1这样的条件来代替。
在实际使用中,如果需要往多个表中插入很多数据,可以采用类似下面的方式:
INSERT ALL
WHEN 1=1 THEN
INTO employee(id, name, sex, age, salary, hiredate)
VALUES(4, '赵六', '男', 30, 10000, TO_DATE('2020-01-01', 'yyyy-mm-dd'))
WHEN 1=1 THEN
INTO department(id, deptname, location)
VALUES(4, '财务部', '深圳')
SELECT * FROM DUAL
UNION ALL
SELECT * FROM (
SELECT 5 AS id, '钱七' AS name, '女' AS sex, 27 AS age, 7000 AS salary, TO_DATE('2020-02-01', 'yyyy-mm-dd') AS hiredate, '网络部' AS deptname, '武汉' AS location FROM DUAL
)
这样就可以往员工表和部门表中插入两条记录了。注意这里使用了UNION ALL语法,用于将两个SELECT语句的结果集合并起来。这个方法可以用来同时插入大量数据到多个表中。
总之,Oracle中的多表插入可以让我们在一个事务中进行多个插入操作,从而提高代码的复用性和执行效率,适用于数据量较大的情况。