PostgreSQL
Laravel
Deployer

Laravel で migrate 実行時に migrations テーブルの id が重複した


概要

Laravel デプロイ時、何故か migrate コマンドで失敗した正常にデプロイできなかったので、その時の原因の調査と解消方法をまとめます。(多分デプロイ時であるかどうかは関係ないです)


環境


  • Laravel 5.7

  • PostgreSQL

  • Deployer (デプロイツール)


起きたこと

Deployer が php artisan migrate --force を実行した時に、 PostgreSQL の migrations テーブルに既存の id と同じ値で INSERT しようとしたため、ユニーク制約が掛かっているのでダメだと言われコケたようです。


[Deployer\Exception\RuntimeException (1)]
The command "/usr/bin/php /var/www/html/releases/214/artisan migrate --force" failed.

Exit Code: 1 (General error)

Host Name: 172.30.1.94

================
Migrating: 2019_04_02_path_to_migration_file

In Connection.php line 664:

SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates u
nique constraint "migrations_pkey"
DETAIL: Key (id)=(1314) already exists. (SQL: insert into "migrations" ("m
igration"
, "batch") values (2019_04_02_path_to_migration_file, 10))

In PDOStatement.php line 119:

SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates u
nique constraint "migrations_pkey"
DETAIL: Key (id)=(1314) already exists.

In PDOStatement.php line 117:

SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates u
nique constraint "migrations_pkey"
DETAIL: Key (id)=(1314) already exists.


解消手順

migrations テーブルの id カラムの sequence の last_value を以下のSQLで確認しました。

select * from migratinos_id_seq

実際に last_value が、失敗した INSERT 時に指定していた値になっていたので、

これを実際の現在の最大値に設定し直しました。

select setval('migratinos_id_seq', {最大値})

この状態でデプロイをやり直したら解決しました。


起きた原因

特定できませんでした :joy: