既存のテーブル構造を新しいテーブル構造にコピーする簡単な方法はありますか? (データは必要ありません。構造のみ -> id INTEGER、name varchar(20) ...)
どうも
次のようなコマンドを使用できます。
CREATE TABLE copied AS SELECT * FROM mytable WHERE 0
しかし、SQLite の動的型付けにより、ほとんどの型情報が失われます。
元のテーブルと同じように動作するテーブル、つまり列の数と名前が同じで、同じ値を格納できるテーブルが必要な場合は、これで十分です。
元の型情報とまったく同じ型情報が本当に必要な場合は、次のようにテーブルから元の SQLCREATE TABLE
ステートメントを読み取ることができます。sqlite_master
SELECT sql FROM sqlite_master WHERE type='table' AND name='mytable'
記録のために-これは私にとってはうまくいきました:
CREATE TABLE mytable (
contact_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
phone TEXT NOT NULL UNIQUE
);
-- Two variations
INSERT INTO mytable VALUES ( 1, "Donald", "Duck", "noone@nowhere.com", "1234");
INSERT INTO mytable ( contact_id,first_name,last_name,email,phone ) VALUES ( 2, "Daisy", "Duck", "daisy@nowhere.com", "45678");
.output copied.sql
-- Add new table name
.print CREATE TABLE copied (
-- Comment out first line from SQL
SELECT "-- " || sql FROM sqlite_master WHERE type='table';
.output
.read copied.sql
.schema
select * from copied;
これは、スキーマが の後にラップされている場合にのみ機能することに注意してくださいCREATE TABLE mytable (
。それ以外の場合は、を使用して文字列を置き換える必要があります.system
を好む :
> sqlite3 <db_file>
sqlite3 > .output <output_file>
sqlite3 > .dump <table_name>
上記の行は、DDL および DML ステートメントを含むテーブルのダンプを生成します。
このファイルを変更します。つまり、テーブル名を見つけて新しいテーブル名に置き換えます。
また、 に置き換えます。これ"CREATE TRIGGER "
により"CREATE TRIGGER <NEWTABLE>_"
、既存のトリガーがトリガー名に置き換えられ、新しいテーブル名が付けられます。これにより、一意になり、既存のトリガーと競合することはありません。すべてのスキーマ変更が実装されたら、次を使用してデータベースに読み戻します.read
sqlite3 > .read output_file
これは、次のようなシェル コマンドを使用してシェル ファイルでスクリプト化できます。
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
例えば :
テーブル T があり、新しいテーブルが db ファイル D の TClone で、ファイル F が作成される場合:
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>
新しい名前の元のテーブルと同じスキーマを持つ必要があります。