Doctrine2 не устанавливает последовательность по умолчанию для столбца id (postgres) - PullRequest
14 голосов
/ 20 мая 2011

Простой пример: если я хочу создать таблицу с идентификатором автозаполнения в postgres, я запускаю этот sql:

CREATE SEQUENCE person_id_seq  START 1;

CREATE TABLE person (
    id         integer PRIMARY KEY DEFAULT nextval('person_id_seq'),
    name       varchar(100) NOT NULL
);

и в доктрине я устанавливаю все свойства

class Person {

/**
 * @Id
 * @Column(type="integer", nullable=false)
 * @GeneratedValue(strategy="SEQUENCE")
 * @SequenceGenerator(sequenceName="person_id_seq", initialValue=1, allocationSize=100)
 */
private $id;

но когда я сгенерировал sql (php doctrine orm: schema-tool: create --dump-sql), я получил его:

CREATE TABLE person (
    id INT NOT NULL,
    name VARCHAR(100) NOT NULL
);
CREATE SEQUENCE person_id_seq INCREMENT BY 100 MINVALUE 1 START 1

, но не установил его по умолчанию

\ dчеловек

      Column       |              Type              | Modifiers
-------------------+--------------------------------+-----------
 id                | integer                        | not null
...
..
.

Ответы [ 3 ]

24 голосов
/ 21 мая 2011

Из тонкой инструкции :

4.8.1. Стратегия генерации идентификаторов
...
AUTO (по умолчанию): Говорит Doctrine, чтобы выбрать стратегию, которую предпочитает используемая платформа базы данных. Предпочтительными стратегиями являются IDENTITY для MySQL, SQLite и MsSQL и SEQUENCE для Oracle и PostgreSQL. Эта стратегия обеспечивает полную мобильность.
...
IDENTITY: Указывает Doctrine использовать специальные столбцы идентификаторов в базе данных, которые генерируют значение при вставке строки. Эта стратегия в настоящее время не обеспечивает полную переносимость и поддерживается следующими платформами: MySQL / SQLite (AUTO_INCREMENT), MSSQL (IDENTITY) и PostgreSQL (SERIAL).

Они предлагают AUTO для максимальной переносимости:

/**
 * @Id
 * @Column(type="integer", nullable=false)
 * @GeneratedValue
 */

Это должно создать и связать последовательность для вас. Альтернативой может быть запрос столбца serial с использованием стратегии IDENTITY:

/**
 * @Id
 * @Column(type="integer", nullable=false)
 * @GeneratedValue(strategy="IDENTITY")
 */

В этом столбце id следует создать тип serial, а PostgreSQL создаст последовательность и установит для вас значение по умолчанию.

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

Попробуйте использовать strategy="AUTO". Если это не сработает, попробуйте strategy="IDENTITY".

4 голосов
/ 13 мая 2013

Я столкнулся с этой проблемой сегодня и обнаружил, что:

  • IDENTITY работает хорошо, потому что он использует тип SERIAL для PostgreSQL, который автоматически создает связанную последовательность и устанавливает значение по умолчанию в качестве nextval (sequence)

  • AUTO создает таблицу и затем связанную последовательность, но не устанавливает значение по умолчанию для столбца id.Его можно установить, добавив следующий код:

    /**
     * Webpage's ID
     *
     * @ORM\Id
     * @ORM\Column(type="integer", options={"default"="nextval('webpages_id_seq'::regclass)"})
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;
    

    , но, к сожалению, Doctrine сначала создает таблицу, поэтому нам необходимо поменять местами таблицу и последовательность создания кода SQL, чтобы последовательность была создана первой

  • SEQUENCE работает так же, как AUTO

0 голосов
/ 22 марта 2018

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

Итак, это вывод bin/console doctrine:schema:create --dump-sql

CREATE TABLE data_sample (id INT NOT NULL, hashvalue VARCHAR(64) DEFAULT NULL, date TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, refdate TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, value NUMERIC(20, 2) NOT NULL, PRIMARY KEY(id));

CREATE SEQUENCE data_sample_id_seq INCREMENT BY 1 MINVALUE 1 START 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...