鲜为人知的SQL功能:默认值

鲜为人知的SQL功能是DEFAULT关键字,它可以在INSERTUPDATE语句中使用。 考虑使用标准SQL语法创建的下表:

CREATE TABLE timestamps (
  id INTEGER   GENERATED BY DEFAULT 
               AS IDENTITY(START WITH 1),
  t  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

  CONSTRAINT pk_values PRIMARY KEY (id)
)

现在,为了在此表中生成新记录,您可以这样显式设置时间戳:

INSERT INTO timestamps (t) 
  VALUES (CURRENT_TIMESTAMP);

或者,您仅使用方便的DEFAULT VALUES语法:

-- Short syntax
INSERT INTO timestamps DEFAULT VALUES;

-- Explicit syntax
INSERT INTO timestamps (t) 
  VALUES (DEFAULT);
INSERT INTO timestamps (id, t) 
  VALUES (DEFAULT, DEFAULT);

可以在UPDATE语句中完成相同的操作:

-- Set all timestamps to CURRENT_TIMESTAMP
UPDATE timestamps SET t = DEFAULT;

SQL默认值的兼容性

与SQL一样,情况并不像SQL-92标准所规定的那样明亮。 根据标准,必须支持上述所有条件。 实际上,可以这样说:

符合标准的数据库

这些数据库完全支持标准

几乎兼容的数据库

这些数据库支持DEFAULT关键字,但不支持插入语句的DEFAULT VALUES子句:

  • 访问
  • DB2
  • Derby(为此我们创建了DERBY-6444
  • 玛丽亚数据库
  • 的MySQL
  • 甲骨文

在jOOQ 3.3中支持默认值

当组合插入DEFAULT值和在插入之后返回它们时, jOOQ 3.3将支持DEFAULT VALUES语法以及它的一个非常有用的变体:

DSL.using(configuration)
   .insertInto(TIMESTAMPS)
   .defaultValues()
   .returning(TIMESTAMPS.ID, TIMESTAMPS.T)
   .fetch();

上面的查询不仅将插入具有默认值的新记录,还将这些值返回给Java程序以进行进一步处理。 与大多数jOOQ API元素一样,以上语句将通过本机语法透明地适用于所有数据库:

  • DB2: SELECT .. FROM FINAL TABLE (INSERT ..)
  • PostgreSQL: INSERT .. RETURNING

…或通过JDBC的Statement.getGeneratedKeys()


翻译自: https://www.javacodegeeks.com/2014/01/lesser-known-sql-features-default-values.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值