本节书摘来自异步社区出版社《Oracle SQL疑难解析》一书中的第1章,第1.4节,作者: 【美】Grant Allen , Bob Bryla , Darl Kuhn,更多章节内容可以访问云栖社区“异步社区”公众号查看。
Oracle SQL疑难解析
要在表中添加几行数据,例如,当一个新员工加入公司时,我们需要把员工信息添加到HR.EMPLOYEES表中。
使用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);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语句时,一定要指定字段名。
相关资源:Oracle数据库精讲与疑难解析part1