Статьи

Малоизвестные возможности SQL: ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ

Менее известной функцией 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),
  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 . Согласно стандарту, все вышеперечисленное должно поддерживаться. На самом деле это можно сказать так:

Соответствующие стандартам базы данных

Эти базы данных поддерживают стандарт, полностью

Почти совместимые базы данных

Эти базы данных поддерживают ключевое слово 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.

Ссылка: малоизвестные возможности SQL: ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ от нашего партнера по JCG Лукаса Эдера из блога JAVA, SQL и JOOQ .