SQL 主要提供了两种增加数据的方法:
- INSERT INTO … VALUES … ;
- INSERT INTO … SELECT … ;
首先,第一种形式的语法如下:
INSERT INTO t(col1, col2, ...)
VALUES (value1, value2, ...);
其中,t 是表名;VALUES 子句中提供的值与 INSERT INTO 中的字段数量必须相同,并且数据类型能够兼容。
举例来说:
-- 只有 Oracle 需要执行以下 alter 语句
-- alter session set nls_date_format = 'YYYY-MM-DD';
INSERT INTO employee(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, bonus, email)
VALUES ( 26, '张三', '男', 5, 18, '2019-12-25', 10, 6000, NULL, 'zhangsan@shuguo.com');
以上语句为员工表增加了一个员工。如果 VALUES 值列表与表中的字段顺序完全一致,可以省略字段列表;以上示例也可以简写成:
-- 只有 Oracle 需要执行以下 alter 语句
-- alter session set nls_date_format = 'YYYY-MM-DD';
INSERT INTO employee
VALUES ( 26, '张三', '男', 5, 18, '2019-12-25', 10, 6000, NULL, 'zhangsan@shuguo.com');
如果同时执行了上面的两个插入语句,第 2 次执行时将会产生主键冲突的错误。因为数据库在插入数据之前将会执行完整性检查,对于违反约束的数据提示错误,而不会生成新的数据。以下两个语句分别违反了外键约束和非空约束:
-- 违反外键约束,职位不存在
INSERT INTO employee(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, bonus, email)
VALUES ( 27, '李四', '男', 5, 18, '2019-12-25', 0, 6000, NULL, 'lisi@shuguo.com');
-- 违反非空约束,姓名不能为空
INSERT INTO employee(emp_id)
VALUES ( 28 );
第二种插入数据的语法通过 SELECT 语句查询出一个结果集,然后将该结果集插入表中。我们先创建一个新表 emp_devp:
CREATE TABLE emp_devp
( emp_id INTEGER NOT NULL PRIMARY KEY
, emp_name VARCHAR(50) NOT NULL
, sex VARCHAR(10) NOT NULL
, dept_id INTEGER NOT NULL
, manager INTEGER
, hire_date DATE NOT NULL
, job_id INTEGER NOT NULL
, salary NUMERIC(8,2) NOT NULL
, bonus NUMERIC(8,2)
, email VARCHAR(100) NOT NULL
) ;
然后通过一个查询语句,将研发部的员工信息复制到 emp_devp 表中:
INSERT INTO emp_devp(emp_id, emp_name, sex, dept_id, manager, hire_date, job_id, salary, bonus, email)
SELECT *
FROM employee
WHERE dept_id = (SELECT dept_id FROM department WHERE dept_name = '研发部');
这种语法通常用于数据仓库中的 ETL(抽取、转换和加载)或者生成测试数据。