4.3使用NULL代替默认值
问题:
在一个定义了默认值的列插入数据,并且需要不管该列的默认值是什么,都将该列值设为NULL。考虑一下下面的表:
create table D (id interger default 0, foo varchar(10))
希望插入一行, 其中id值为NULL
解决方案:
可以在值列表中明确地指定NULL值:
insert into d (id, foo) values (null, 'Brighten')
讨论
并不是所有人都知道可以在insert语句的值列表中明确指定NULL值。人们通常的做法是,如果在插入操作时不需要对某列指定值,只是将该列从插入列表和值列表中去掉。
insert into d (foo) values('Brighten')
在上面的语句中没有指定id值。许多人可能认为列没有被指定值时,应当被赋予空值。但是,如果该列在创建的时候被指定了默认值,结果就是在执行insert指令时,id字段的值被赋予0(默认值)。如果想要将某列的值设定为null。则就需要指定该列值为null,而不管该列是否有默认值。
4.4从一个表向另外的表中复制行
问题:
要使用查询从一个表中向另外的表中复制行。该查询可能非常复杂,也可能非常简单。但是最终是需要将该查询的结果插入到其他的表中。(同样的列名称以及数据类型)
解决方案:
所使用的方法就是在insert语句后面紧跟着一个用来产生所要插入的行的查询:
insert into dept_east (deptno, dname, loc)
select deptno, dname, loc
from dept
where loc in ('NEW YORK', 'BOSTON')
讨论:
最简单的方法就是在insert语句后面跟随一个查询,该查询用来返回想要得到的行。如果想要从源表中复制所有的行,则贼查询种就不需要使用where子句。跟普通的插入语句一样,插入时不一定要指定插入哪些列,但是,如果没有指定要插入的目标列,则必须插入表中所有的列,而且要清楚select表中值得顺序,就想在4.1中所介绍的那样。
4.5复制表定义
问题:
要创建新表,该表与已有表的列设置相同。例如,想要创建一个dept表的副本,名为dept_2,但只是想复制表结构而不想要复制源表中的记录。
解决方案:
DB2
使用带有like子句的create table 命令:
create table dept_2 like dept
Oracle、MySQL和PostgreSQL
在create table命令中,使用一个不返回任何行的子查询:
create table dept_2
as
select * from dept
where 1 = 0
使用带有不返回任何行的查询(虽然原文中用的是subquery)但这里跟一般所说的子查询不大相同,建议就改成查询和into子句:
select * into ept_2
from dept
where 1 = 0
讨论:
DB2
DB2的create table … like命令应用简单,可以用一个表作为父表,来创建另外一个表。只需要在like关键字后面指定父表名称即可。
Oracle、MySQL、和PostgreSQL
当使用create table as select 语句时,除非在where子句中指定了为‘false ’的条件(此时将生成一个空表),否则在查询中所生成的所有记录都会加到新生成的表中。在解决方案中,在where子句中的表达式为‘1=0’导致了查询不返回任何行,这样,ctas语句的结果就是根据查询中select子句中的列名而产生的空表