SQLCookBook第四章学习日记12

4.3使用NULL代替默认值

问题:
在一个定义了默认值的列插入数据,并且需要不管该列的默认值是什么,都将该列值设为NULL。考虑一下下面的表:

create table D (id interger default 0, foo varchar(10))

希望插入一行, 其中id值为NULL

解决方案:
可以在值列表中明确地指定NULL值:

insert into d (id, foo) valuesnull, '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子句中的列名而产生的空表

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值