将表结构复制到sqlite3中的新表

时间:2012-10-04 15:12:25

标签: sql database sqlite copy

是否有一种简单的方法可以将现有表结构复制到新表结构? (不需要数据,只需要结构 - >比如id INTEGER,名称varchar(20)......)

THX

5 个答案:

答案 0 :(得分:74)

你可以使用这样的命令:

CREATE TABLE copied AS SELECT * FROM mytable WHERE 0

但由于SQLite的动态类型,大多数类型信息都会丢失。

如果您只需要一个行为与原始行为相似的表,即具有相同的列数和名称,并且可以存储相同的值,这就足够了。

如果您确实需要与原始类型信息完全相同的类型信息,则可以从CREATE TABLE表中读取原始SQL sqlite_master语句,如下所示:

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

答案 1 :(得分:11)

SQLite无法使用PK,默认值和索引克隆表。

必须使用其他工具进行黑客攻击。

在shell中,用sed替换表名。

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

你可以查看新表。

sqlite3 dbfile '.schema newtable'

将保留主键,默认值和索引。

我希望这个命令可以帮到你。

答案 2 :(得分:0)

sqlite> .schema

CREATE TABLE [About](
  [id],
  [name],
  [value]);

.schema命令将为您提供About-table的结构,如何通过手动编程SQLite解释器并键入命令来制作它。

粘贴并执行,在CREATE块中赋予表新名称:

sqlite> CREATE TABLE [AboutToo](
  [id],
  [name],
  [value]);

.tables命令现在将显示您有两个表(已复制),旧表和新表。

sqlite> .tables
About     AboutToo

p.s。 sqlite>是启动SQLite.exe解释器后进入控制台的命令提示符。要获取它,请访问www.sqlite.org

答案 3 :(得分:0)

仅作记录-这对我有用:

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

进行一些字符串替换。

答案 4 :(得分:-1)

我更愿意:

> sqlite3 <db_file>

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

上面的行生成包含DDL和DML语句的表的转储。

在此文件中进行更改,即使用新表名

查找并替换表名

此外,将"CREATE TRIGGER "替换为"CREATE TRIGGER <NEWTABLE>_",这将使用具有新表名的触发器名称替换现有触发器。这将使其独一无二,不会与现有触发器发生冲突。实施所有架构更改后,使用.read

将其读回数据库
sqlite3 > .read output_file

这可以使用shell命令在shell文件中编写脚本,如:

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>

应该与具有新名称的原始表具有相同的模式。