2012-10-04 5 views
27

既存のテーブル構造を新しいテーブル構造に簡単にコピーする方法はありますか? - (構造のみ、データを必要といけない...のid INTEGER、名前のVARCHAR(20)のように>)あなたはこのようなコマンドを使用することができテーブル構造をsqlite3の新しいテーブルにコピー

Thxを

答えて

59

CREATE TABLE copied AS SELECT * FROM mytable WHERE 0 

が、 SQLiteの動的な型付けのために、ほとんどの型情報は失われます。

元のように動作するテーブル、つまり列の番号と名前が同じで、同じ値を格納できるテーブルが必要な場合は、これで十分です。

あなたが本当に正確に元のような種類の情報が必要な場合、あなたはこのようなsqlite_masterテーブルから元のSQL CREATE TABLE文で、読むことができます:

SELECT sql FROM sqlite_master WHERE type='table' AND name='mytable' 
+2

しかし、selectステートメントの出力を使って新しいテーブルを作成するにはどうすればよいですか? – malhal

+1

これはSQLコマンドです。あなたはそれを実行する。 –

+4

私はindiekidukがSQL内からプログラムでこれを行う方法があるかどうかを尋ねていると思います。それは良い質問だと思います。これを行う方法がある場合は、その答えが改善されるでしょう。 – metasoarous

9

SQLiteのは、PK、デフォルトおよびインデックスを持つテーブルのクローンを作成することはできませんが。

別のツールでハッキングする必要があります。

シェルでは、テーブル名をsedで置き換えます。

sqlite3 dbfile '.schema oldtable' | sed '1s/oldtable/newtable/' | sqlite3 dbfile 

新しいテーブルを確認することができます。

sqlite3 dbfile '.schema newtable' 

プライマリキー、デフォルトおよびインデックスは予約されます。

このコマンドがお役に立てば幸いです。

-1

私が希望:

> sqlite3 <db_file> 

sqlite3 > .output <output_file> 
sqlite3 > .dump <table_name> 

上記の行は、DDLとDML文を含む表のダンプを生成します。

"CREATE TRIGGER <NEWTABLE>_""CREATE TRIGGER "を置き換え、また、このファイルの変更、すなわち、新しいテーブル名とテーブル名を検索と置換

を作り、これはその上に新しいテーブル名とトリガー名を持つ既存のトリガーを置き換えます。それはそれをユニークにし、既存のトリガーと競合することはありません。例えば

echo ".dump <table>" | sqlite3 <db_file> > <table_file> 
sed -i.bak "s/\b<table_name>\b/<new_table_name>/g" <table_file> 
sed -i.bak "s/\bCREATE TRIGGER \b/CREATE TRIGGER <new_table_name_>/g" <table_file> 
echo ".read <table_file>" | sqlite3 <db_file> 
rm <table_name>.bak 

お持ちの場合は、一度、すべてのスキーマ変更が実装され、これは以下のようにシェルコマンドを使用してシェルファイルで指定することができ.read

sqlite3 > .read output_file 

を使用してデータベースに戻ってそれを読んでテーブルTと新しいテーブルは、作成されるファイルFを持つdbファイルDのTCloneです。次に

echo ".dump T" | sqlite3 D.sqlite > F 
sed -i.bak "s/\bT\b/TClone/g" F 
sed -i.bak "s/\bCREATE TRIGGER \b/CREATE TRIGGER TClone_>/g" F 
echo ".read F" | sqlite3 D.sqlite 
rm T.bak 

最後に、このスクリプトを一般化するには、source_table、destination_table、db_fileをパラメータとして渡すことができるパラメータ化されたバージョンを作成します。このパラメータを使用して、テーブルを複製できます。

私はこれをテストして動作します。

テスト:

sqlite3 <database_file> 
sqlite3 > select * from <new_table>; 

あなたの元のテーブルと同じ結果を与える必要があります。

sqlite3 > .schema <new_table> 

は、新しい名前の元のテーブルと同じスキーマを持つ必要があります。

関連する問題