2009-05-12 2 views
5

Есть ли общий, перекрестный RDMS, способ, которым у меня может быть ключ, созданный с помощью вставки JDBC? Например, если у меня есть таблица с первичным ключом, идентификатор и целочисленное значение:Автоматический генерировать ключ на вставке JDBC в SQL Server

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] 

в таблице не повезло.

ответ

6

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

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

  1. Firebird использует последовательность
  2. DB2 позволяет определить столбец как "СОЗДАННЫЕ DEFAULT AS IDENTITY";
  3. Interbase использует последовательность (так называемые генераторы)
  4. MySQL имеет "AUTO_INCREMENT" пункт
  5. Oracle использует последовательности
  6. PostgreSQL использует последовательность
  7. SQLServer имеет "IDENTITY (1,1)" пункт
+0

Для DB2 вы можете выбирать между столбцом идентификации и последовательностью. Я мог бы это сделать и для других rdbms '. – rudolfson

+0

Спасибо за разъяснение. Однако это не считается для других rdbms. По крайней мере, не для Oracle. –

1

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

2

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

2

Это зависит от базы данных. Oracle требует создания SEQUENCE, и в MySQL вы просто устанавливаете столбец как автоматическое увеличение.

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

+0

Чтобы объяснить это немного больше - с помощью Hibernate вы можете создать DDL или даже позволить Hibernate создавать все сопоставленные таблицы при запуске. Вам просто нужно сообщить Hibernate целевой базе данных, используя соответствующий «диалект». – rudolfson