Менее известной функцией SQL является ключевое слово DEFAULT
, которое можно использовать в операторах INSERT
и UPDATE
. Рассмотрим следующую таблицу, созданную с использованием стандартного синтаксиса SQL:
1
2
3
4
5
6
7
|
CREATE TABLE timestamps ( id INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1), t TIMESTAMP DEFAULT CURRENT_TIMESTAMP , CONSTRAINT pk_values PRIMARY KEY (id) ) |
Теперь, чтобы сгенерировать новую запись в этой таблице, вы можете явно установить временную метку как таковую:
1
2
|
INSERT INTO timestamps (t) VALUES ( CURRENT_TIMESTAMP ); |
Или вы просто используете удобный синтаксис DEFAULT VALUES
:
1
2
3
4
5
6
7
8
|
-- Short syntax INSERT INTO timestamps DEFAULT VALUES ; -- Explicit syntax INSERT INTO timestamps (t) VALUES ( DEFAULT ); INSERT INTO timestamps (id, t) VALUES ( DEFAULT , DEFAULT ); |
То же самое можно сделать в операторе UPDATE
:
1
2
|
-- Set all timestamps to CURRENT_TIMESTAMP UPDATE timestamps SET t = DEFAULT ; |
Совместимость SQL для ЗНАЧЕНИЙ ПО УМОЛЧАНИЮ
Как всегда с SQL, все не так ярко, как указано в стандарте SQL-92 . Согласно стандарту, все вышеперечисленное должно поддерживаться. На самом деле это можно сказать так:
Соответствующие стандартам базы данных
Эти базы данных поддерживают стандарт, полностью
- CUBRID
- жар-птица
- H2
- HSQLDB (хотя есть ошибка, о которой мы сообщали )
- Энгр
- PostgreSQL
- SQLite
- SQL Server
- Sybase SQL Anywhere
Почти совместимые базы данных
Эти базы данных поддерживают ключевое слово DEFAULT
, но не предложение DEFAULT VALUES
для операторов вставки:
- Доступ
- DB2
- Дерби (для этого мы создали DERBY-6444 )
- MariaDB
- MySQL
- оракул
Поддержка ЗНАЧЕНИЙ ПО УМОЛЧАНИЮ в jOOQ 3.3
jOOQ 3.3 будет поддерживать синтаксис DEFAULT VALUES
а также очень полезный его вариант при объединении вставки значений DEFAULT
с возвратом их после вставки:
1
2
3
4
5
|
DSL.using(configuration) .insertInto(TIMESTAMPS) .defaultValues() .returning(TIMESTAMPS.ID, TIMESTAMPS.T) .fetch(); |
Приведенный выше запрос не только вставит новую запись со значениями по умолчанию, но также вернет эти значения в вашу программу Java для дальнейшей обработки. Как и с большинством элементов API jOOQ, вышеприведенный оператор будет прозрачно работать со всеми базами данных, либо через собственный синтаксис:
- DB2:
SELECT .. FROM FINAL TABLE (INSERT ..)
- PostgreSQL:
INSERT .. RETURNING
… или через Statement.getGeneratedKeys()
JDBC.