Автоматически генерировать ключ при вставке JDBC в SQL Server

Существует ли общий, перекрестный RDMS, способ, которым я могу автоматически генерировать ключ при вставке JDBC? Например, если у меня есть таблица с первичным ключом, id и значением int:

create table test (
  id int not null,
  myNum int null
)

и сделать вставку

PreparedStatement statement = connection.prepareStatement("insert into test(myNum) values(?)", Statement.RETURN_GENERATED_KEYS);
statement.setInt(1, 555);
statement.executeUpdate();
        statement.close();

Я получаю исключение java.sql.SQLException: Невозможно вставить значение NULL в столбец 'id'.

У меня есть ощущение, что это полностью зависит от RDMS. Мы используем с использованием SQL Server 2005, и я установил

CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 1) ON [PRIMARY]

в таблице без удачи.

4 ответа

Решение

Это полностью зависит от базы данных. Существует два основных варианта: 1 - СУБД, которые допускают автоинкрементное ключевое слово рядом с определением первичного ключа, и 2 - СУБД, которые предоставляют генераторы последовательностей (которые затем можно использовать для генерации новых значений для PK, например, написав триггер "до вставки", который автоматически вставляет новое значение в столбец перед завершением вставки).

Насколько я знаю:

  1. Firebird использует последовательности
  2. DB2 позволяет определять столбец как "GENERATED DEFAULT AS IDENTITY";
  3. Interbase использует последовательности (называемые генераторами)
  4. MySQL имеет предложение "AUTO_INCREMENT"
  5. Oracle использует последовательности
  6. PostgreSQL использует последовательности
  7. SQLServer имеет предложение "IDENTITY(1,1)"

Вам нужно установить столбец идентификатора в тестовой таблице для автоматического создания идентификатора. В случае с SQL Server вам необходимо установить IDENTITY() свойство в столбце ID.

Это зависит от базы данных. Oracle требует создания ПОСЛЕДОВАТЕЛЬНОСТИ, а в MySQL вы просто устанавливаете столбец как автоинкремент.

Вы всегда можете использовать Hibernate.

Насколько я знаю, это зависит от базы данных. Аналогично с вставкой меток времени; некоторые вставят текущее время, когда вы вставите ноль.

Другие вопросы по тегам