Проблемы с использованием аннотации Doctrine 2 @GeneratedValue(strategy=AUTO)

Надеюсь, кто-то может помочь мне с этим. У меня есть следующая аннотация доктрины:

/**
 * @var integer 
 *
 * @Column(name="code", type="integer", length=4)
 * @Id
 * @GeneratedValue(strategy= "AUTO")
 */
private $code;

Где код - первичный ключ моей таблицы. Я хочу, чтобы значение кода правильно устанавливалось (автоматически) каждый раз, когда строка вставляется в таблицу.

Я использую Doctrine 2 и PostgreSQL, и проблема заключается в следующем: Чтобы заранее подготовить БД, я вставляю строки в таблицу с помощью команд SQL непосредственно в PgAdmin. Затем я пытаюсь вставить новые строки, но на этот раз через свою программу, и каждый раз, когда я пытаюсь вставить эту строку, я получаю конфликт первичного ключа, пока я не пробовал столько раз, сколько строк вставлялось ранее с помощью команд SQL.

Например, если я вставил 3 строки с помощью команд SQL, мне пришлось бы попробовать 3 раза с помощью программы, и с четвертой попытки строка была бы правильно вставлена.

Есть ли способ установить начальное значение первичного ключа равным 4 (конечно, это значение зависит от количества строк, уже вставленных с помощью команд SQL перед запуском программы), чтобы избежать конфликтов первичного ключа?

Спасибо!


person cookbook    schedule 25.05.2011    source источник


Ответы (1)


Я думаю, вы вставили значения в свою таблицу вручную, присвоив значение кода:

insert into table (code, ... ) values (1, ...)

В этом случае ваше серийное значение не будет увеличено. Поэтому, когда Doctrine пытается вставить новую строку в базу данных, она будет использовать серийный номер для автоматической нумерации. Последовательный статус по-прежнему имеет значение 1, что вызывает конфликт первичного ключа. Хотя запрос не удался, серийный номер увеличивается на единицу, поэтому в следующий раз он попытается использовать значение 2. Это объясняет, почему после трех попыток вы больше не сталкиваетесь с конфликтом первичного ключа.

Надеюсь, это объяснение поможет.

Удачи!

person Rene Terstegen    schedule 19.10.2011