Составной первичный ключ SQL 2008 с одной частью ключевого автоматического увеличения - PullRequest
0 голосов
/ 03 октября 2011

Простая таблица с составным первичным ключом.
PK1 smallint, PK2 smallint auto increment, strValue varchar(20) not null.

Это работает, но PK2 увеличивается независимо от PK1.

Мне бы хотелось, чтобы PK2 начал все заново со свежего PK1.

Вот что я получаю

    1, 1, 1a
    1, 2, 1b
    2, 3, 2a
    2, 4, 2b

Что я хочу

    1, 1, 1a
    1, 2, 1b
    2, 1, 2a
    2, 2, 2b 

Я так понимаю, мне нужно удалить автоинкремент из PK2 и сгенерировать правильное значение в операторе Insert?Это правильный способ добраться и вы рекомендуете синтаксис для оператора вставки?Автоматическое увеличение PK1 не является опцией, поскольку оно является частью отношения FK.

Предположим, мне нужно вставить 2, x, 3b и узнать, какое значение было назначено для x.
будет много вставок (например, 100 / день).Существует уникальное ограничение для PK1, strValue.

Чтобы было ясно, я думаю, что SQL 2008 делает правильные вещи и не предполагает, что SQL должен вести себя таким образом по умолчанию.

Ответы [ 2 ]

0 голосов
/ 03 октября 2011

Если вы не делаете много вставок в таблицу, вы, вероятно, можете удалить столбец идентификаторов и просто сделать:

IF NOT EXISTS ( SELECT * FROM table WHERE PK1 = 2 AND strValue = '3b' )
BEGIN
  DECLARE @next_PK2 INT

  SELECT
    @next_PK2 = ISNULL(MAX(PK2) + 1, 0) + 1
  FROM
    table
  WHERE
    PK1 = 2

  INSERT table VALUES (2, @next_PK2, '3b')
END
0 голосов
/ 03 октября 2011

Да, если вы хотите управлять инкрементным значением PK2, вам нужно сгенерировать его во время вставки (например, с помощью ROW_NUMBER(). Нет другого способа установить PK2 независимо.

...