SQLite3でUNIQUE制約を後から追加する

背景

SQLite3のデータベースで、後からUNIQUE制約を付与する作業が発生しました。

しかし、SQLite3では後から制約を変更する方法は用意されていません。

この方法を記しておきます。

手順

まず、基本として、後から制約する場合は新しいデータベースを作成する必要があります。

そのため、データベースを一旦エクスポートして、それを新しいデータベースにインポートする作業を行います。

エクスポート dump

エクスポートにはdumpコマンドを使用します。

ここでは、データベースファイルは「wikipedia_summary.db」です。

$ sqlite3 db/wikipedia_summary.db 
SQLite version 3.26.0 2018-12-01 12:34:55
Enter ".help" for usage hints.
sqlite> .output dump.sql   # outputコマンドでファイルに出力することを指定します
sqlite> .dump  # ファイルにエクスポートを実行
sqlite> .quit

新しいデータベースファイルを作成

UNIQUE制約のある新しいデータベースファイルを作成してください。

ここでは、「wikipedia_summary2.db」という新しいDBファイルを作成しました。

インポート read

新しいデータベースファイルにインポートします。

UNIQUE 制約に引っかかったデータはfailして登録されません。

$ sqlite3 db/wikipedia_summary2.db 
SQLite version 3.26.0 2018-12-01 12:34:55
Enter ".help" for usage hints.
sqlite> .read dump.sql
Error: near line 3: table wikipedia_summary2 already exists
Error: near line 276824: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276864: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276865: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276867: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276868: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276870: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276871: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276873: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276874: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276876: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276877: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276879: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276880: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276882: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276884: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276885: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276887: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276888: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 276890: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 319347: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 319392: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 409169: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 1024862: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 1024865: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 1024979: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 1024996: UNIQUE constraint failed: wikipedia_summary2.request
Error: near line 1024997: UNIQUE constraint failed: wikipedia_summary2.request
sqlite> .quit

データベースファイルを上書き

成功したらデータベースファイルを上書きしてしまいます。

mv db/wikipedia_summary2.db db/wikipedia_summary.db

以上で完了です。

コメント

タイトルとURLをコピーしました