Остановите Doctrine, запрашивая nextval перед вставкой данных - PullRequest
0 голосов
/ 31 октября 2018

Я использую Doctrine с базой данных postgres. Мои первичные ключи настроены как последовательности, например так:

/**
 * @ORM\Entity()
 */
class Thing
{
    /**
     * @var int
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue()
     * @ORM\Id()
     */
    protected $id;

Я сохраняю новую сущность, подобную этой:

$thing = new Thing();
$em->persist($thing);
$em->flush();

Когда я делаю это, журнал запросов показывает, что доктрина вызывает SELECT NEXTVAL('thing_id_seq'), чтобы сгенерировать идентификатор для новой сущности перед выполнением запроса INSERT.

Если я вставлю 100 сущностей, он будет вызывать SELECT NEXTVAL('thing_id_seq') 100 раз. (Я знаю, что такие массовые вставки должны выполняться напрямую с помощью SQL, но вы меня поняли.)

Есть ли способ остановить Doctrine, выполняющего отдельный запрос для генерации идентификатора? (и затем запрос будет возвращен идентификатором INSERT), или это просто так?

Я думаю, что postgres автоматически генерирует значения последовательности, что может усложнить некоторые вещи, мне просто интересно, возможно ли это / поддерживается.

PS: я не использую Symfony, но использовал его в прошлом, поэтому буду рад любым ответам на основе Symfony, которые я смогу исследовать.

1 Ответ

0 голосов
/ 31 октября 2018

Эквивалентом автоматически увеличенного столбца в PostgreSQL является тип «SERIAL». Но большинство людей используют последовательности, потому что можно изменять / сбрасывать / ... последовательности, пока у вас нет большого контроля над типом SERIAL. Вы также можете назначить последовательность nextvalue для столбца по умолчанию следующим образом:

CREATE TABLE test (
    id smallint NOT NULL DEFAULT nextval('test_id_seq')
);

Если вы предпочитаете использовать тип SERIAL для столбца Doctrine, вы можете пометить свойство id с помощью:

@ORM\GeneratedValue(strategy="IDENTITY")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...