У меня странная ошибка с 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, ничего не работает, кроме переиндексации, но только после того, как я получу фактическую ошибку. Повторное индексирование сразу после создания новых таблиц не позволяет избежать ошибки.
@KamilG. дублирование невозможно, после drop table и воссоздания таблиц, так как база данных пуста
@ KamilG. Эта проблема возникает при первой попытке вставить. И если будут дубликаты, команда reindexdb не исправит
Я не смогу воспроизвести его без данных, которые его вызывают. Он отлично работает для меня.
@KamilG. есть ли способ перечислить содержимое индекса в postgres? возможно, я смогу использовать это, чтобы проверить, действительно ли индексы удалены сразу после drop
если он воспроизводится в 100% случаев - поделитесь, пожалуйста, полной последовательностью действий и версией postgres. не звучит воспроизводимо для меня: /
@VaoTsun, я имею в виду, я все время получаю эту ошибку, но база данных, которую я отбрасываю, имеет размер около 5 ГБ, я могу воспроизвести ее только на своей машине
ох ... ну - тогда тебе, наверное, нужно внимание живым.
Не могли бы вы показать нам точно, как вы бросаете этот стол? Есть ли другие таблицы, относящиеся к account? А это какая версия Postgres? Наконец, уверены ли вы, действительно действительно действительно, что в ваших данных нет дубликатов? select account_id from account group by account_id having count(account_id) > 1
Пожалуйста, также покажите нам, как вы перезагружаете таблицу, это может быть актуально. Если вы одновременное построение индексов, это может привести к повреждению.
@Schwern, спасибо, ошибку обнаружил, она у меня в коде. Я предварительно вставляю и учетную запись с ID = 1, и когда последовательность использует его, я получаю эту ошибку дублирования pkey. Вторая временная последовательность имеет значение 1, и ошибки не возникает.
@Nulik, значит, это был мой первый вопрос, который вы сказали, что они "невозможны" ...
@ KamilG. Меня просто обманул тот факт, что reindexdb исправил ошибку, но этого не произошло, только первый INSERT не работает.


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