本节书摘来自异步社区出版社《Oracle SQL疑难解析》一书中的第1章,第1.4节,作者: 【美】Grant Allen , Bob Bryla , Darl Kuhn,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.4 在表中添加记录行
Oracle SQL疑难解析
1.4.1 要解决的问题
要在表中添加几行数据,例如,当一个新员工加入公司时,我们需要把员工信息添加到HR.EMPLOYEES表中。
1.4.2 解决方法
使用INSERT语句向表中添加数据。添加时,需要提供每列(强制列和可选列)的值,下面是添加新员工信息的一条语句:
insert into hr.employees
(employee_id, first_name, last_name, email, phone_number, hire_date, job_id,
salary, commission_pct, manager_id, department_id)
values
(207, 'John ', 'Doe ', 'JDOE ', '650.555.8877 ', '25-MAR-2009 ', 'SA_REP ',
3500, 0.25, 145, 80);
1.4.3 数据库如何工作
INSERT语句后面跟着各个字段名和各字段对应的值,它把对应的字段名和值对应后,形成行记录,然后插入目标表中。
Oracle会检查NULL值约束、主键、外键及其他约束来确保插入数据的完整性。第10章会介绍在表上定义约束的技巧,以及表上的约束如何影响新数据的插入。
我们可以通过表的描述来查看哪些字段是MANDATORY,定义为非空。方法是在SQL Developer 中或用SQL*Plus的DESCRIBE命令,这个命令也可缩写为DESC。例如:
desc hr.employees;
Name Null Type
------------------------------ -------- ------------
EMPLOYEE_ID NOT NULL NUMBER(6)
FIRST_NAME VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(25)
EMAIL NOT NULL VARCHAR2(25)
PHONE_NUMBER VARCHAR2(20)
HIRE_DATE NOT NULL DATE
JOB_ID NOT NULL VARCHAR2(10)
SALARY NUMBER(8,2)
COMMISSION_PCT NUMBER(2,2)
MANAGER_ID NUMBER(6)
DEPARTMENT_ID NUMBER(4)
11 rows selected
在使用INSERT语句时,如果把每列的值都按它们在当前表定义中的排列顺序(用DESC查看表得到的顺序)提供,那么也可以省略在语句中列出字段名,示例如下:
在INSERT语句中省略字段名的做法,非常少见,也有很大的风险,除非有什么的特殊的理由,不然就别这么做,别把你的SQL语句搞得太脆弱,因为无法预知在何时表的结构会发生变化。举例来说,如果将来有人重建表,而且表中的字段排列顺序发生改变,碰巧你的INSERT语句通过字段类型和其他约束性检查,你就在没有错误提示的情况下,把数据写入了表中错误的字段,那将是场灾难。所以,强烈建议在写INSERT语句时,一定要指定字段名。