アフィリエイト広告を利用しています

【sqlite3】create table asってそういう仕様だったんですね・・・

SQLite3でテーブルをコピーする方法の一つ、create table as構文にはちょっとした罠があります。
「create table 新しいテーブル名 as select * from 元となるテーブル名」

これで「元となるテーブル」と同じスキーマーの「新しいテーブル」が作成され、さらにデータもコピーできると思い込んでいました。

主キーが設定されたテーブルのcreate table asで作成された「新しいテーブル」には、primary keyが存在しませんでした。

SQLite3ではprimary keyはcreate tableのみ設定することができます。ALTER TABLE構文では対応していません顔3(かなしいカオ)

同一データベースファイル中であれば、ALTER TABLEで名前を変えるのが一番手っ取り早いです。

attach databaseで別のデータベースファイルにあるテーブルのコピー手段として、create table asを使っていました。

この場合の対策案は、2つあります。
  1. 1 主キーのあるテーブルは、create table asでコピーしない。
    create table 新しいテーブル( pk primary key ... )
    insert into 新しいテーブル select * from 元となるテーブル

    テーブルのスキーマーは、以下SQLで取得できます。
    SELECT sql FROM SQLITE_MASTER WHERE name='元となるテーブル'


  2. 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〜)
  • 大量アクセスでも安心 転送量は無制限

 

 

この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/12285773
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック
最新記事
最新コメント
タグクラウド
カテゴリアーカイブ