「create table 新しいテーブル名 as select * from 元となるテーブル名」
これで「元となるテーブル」と同じスキーマーの「新しいテーブル」が作成され、さらにデータもコピーできると思い込んでいました。
主キーが設定されたテーブルのcreate table asで作成された「新しいテーブル」には、primary keyが存在しませんでした。
SQLite3ではprimary keyはcreate tableのみ設定することができます。ALTER TABLE構文では対応していません
同一データベースファイル中であれば、ALTER TABLEで名前を変えるのが一番手っ取り早いです。
attach databaseで別のデータベースファイルにあるテーブルのコピー手段として、create table asを使っていました。
この場合の対策案は、2つあります。
- 1 主キーのあるテーブルは、create table asでコピーしない。
create table 新しいテーブル( pk primary key ... )
insert into 新しいテーブル select * from 元となるテーブル
テーブルのスキーマーは、以下SQLで取得できます。
SELECT sql FROM SQLITE_MASTER WHERE name='元となるテーブル' - 2 dumpを使って経由する
sqlite3 元.sqlite3 .dump 元となるテーブル | sqlite3 運用.sqlite3
→ 元となるテーブルが正しくコピーされます。
sqlite3 運用.sqlite3 "alter table 元となるテーブル rename to 新しいテーブル"
運用.sqlite3に「元となるテーブル」名と同名がある場合は、上記を応用し、一時的なsqlite3データベースを作成して、経由することで別名を実現可能です。
- 初期費用0円(2022年8月4日に撤廃)
- 安定したサイト運営が可能(CPU/メモリ リソース保証 6コア/8GB〜)
- 契約中は独自ドメインつき 独自ドメイン永久無料特典があります
- 最大10日間無料で、サーバーのお試し利用ができます
- ディスクキャッシュも高速 NVMe SSDを採用(300GB〜)
- 大量アクセスでも安心 転送量は無制限
【このカテゴリーの最新記事】
-
no image
-
no image