Индекс Postgres повреждается при перетаскивании таблиц

У меня странная ошибка с Postgres: всякий раз, когда я drop свои таблицы и заново создаю их, я получаю эту ошибку:

Fatal: Error: can't insert into `accounts` table. error=pq: duplicate key value violates unique constraint "account_pkey"

Чтобы исправить это, я делаю:

reindexdb mydb

И это работает постоянно. Эта ошибка воспроизводится в 100% случаев. Что я делаю не так? Почему индексы портятся? Есть предложения по устранению этой проблемы?

Не думаю, что это актуально, но таблица аккаунтов определяется так:

CREATE TABLE account (
        account_id                      SERIAL                  PRIMARY KEY,
        owner_id                        INT                     NOT NULL DEFAULT 0,
        last_balance                    NUMERIC                 DEFAULT 0,
        num_tx                          BIGINT                  DEFAULT 0,
        ts_created                      INT                     DEFAULT 0,
        block_created                   INT                     DEFAULT 0,
        deleted                         SMALLINT                DEFAULT 0,
        block_sd                        INT                     DEFAULT 0,
        address                         TEXT                    NOT NULL
);
CREATE INDEX account_addr_idx   ON      account                 USING   hash    ("address");
CREATE INDEX account_owner_idx  ON      account                 USING   btree   ("owner_id");
CREATE INDEX account_deleted_idx ON     account                 USING   btree   ("deleted");

Я попытался сбросить соединения или перезапустить демон postgres, ничего не работает, кроме переиндексации, но только после того, как я получу фактическую ошибку. Повторное индексирование сразу после создания новых таблиц не позволяет избежать ошибки.

Вы действительно проверяли свои данные на наличие дубликатов на account_id?

Kamil Gosciminski 29.05.2018 19:44

@KamilG. дублирование невозможно, после drop table и воссоздания таблиц, так как база данных пуста

Nulik 29.05.2018 20:02

@ KamilG. Эта проблема возникает при первой попытке вставить. И если будут дубликаты, команда reindexdb не исправит

Nulik 29.05.2018 20:03

Я не смогу воспроизвести его без данных, которые его вызывают. Он отлично работает для меня.

Kamil Gosciminski 29.05.2018 20:05

@KamilG. есть ли способ перечислить содержимое индекса в postgres? возможно, я смогу использовать это, чтобы проверить, действительно ли индексы удалены сразу после drop

Nulik 29.05.2018 20:37

если он воспроизводится в 100% случаев - поделитесь, пожалуйста, полной последовательностью действий и версией postgres. не звучит воспроизводимо для меня: /

Vao Tsun 29.05.2018 21:20

@VaoTsun, я имею в виду, я все время получаю эту ошибку, но база данных, которую я отбрасываю, имеет размер около 5 ГБ, я могу воспроизвести ее только на своей машине

Nulik 29.05.2018 21:28

ох ... ну - тогда тебе, наверное, нужно внимание живым.

Vao Tsun 29.05.2018 21:40

Не могли бы вы показать нам точно, как вы бросаете этот стол? Есть ли другие таблицы, относящиеся к account? А это какая версия Postgres? Наконец, уверены ли вы, действительно действительно действительно, что в ваших данных нет дубликатов? select account_id from account group by account_id having count(account_id) > 1

Schwern 29.05.2018 21:52

Пожалуйста, также покажите нам, как вы перезагружаете таблицу, это может быть актуально. Если вы одновременное построение индексов, это может привести к повреждению.

Schwern 29.05.2018 21:58

@Schwern, спасибо, ошибку обнаружил, она у меня в коде. Я предварительно вставляю и учетную запись с ID = 1, и когда последовательность использует его, я получаю эту ошибку дублирования pkey. Вторая временная последовательность имеет значение 1, и ошибки не возникает.

Nulik 29.05.2018 22:44

@Nulik, значит, это был мой первый вопрос, который вы сказали, что они "невозможны" ...

Kamil Gosciminski 30.05.2018 00:38

@ KamilG. Меня просто обманул тот факт, что reindexdb исправил ошибку, но этого не произошло, только первый INSERT не работает.

Nulik 30.05.2018 01:10
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
13
151
0

Другие вопросы по теме