鲜为人知的SQL功能是DEFAULT
关键字,它可以在INSERT
和UPDATE
语句中使用。 考虑使用标准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标准所规定的那样明亮。 根据标准,必须支持上述所有条件。 实际上,可以这样说:
符合标准的数据库
这些数据库完全支持标准
- BR
- 火鸟
- H2
- HSQLDB(尽管有一个错误,我们已经报告了 )
- 英格利斯
- PostgreSQL的
- SQLite的
- SQL服务器
- Sybase SQL Anywhere
几乎兼容的数据库
这些数据库支持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