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

问题描述 投票:0回答:7

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

谢谢

sql database sqlite copy
7个回答
109
投票

您可以使用这样的命令:

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'

12
投票

SQLite 无法克隆具有 PK、默认值和索引的表。

需要使用其他工具进行黑客攻击。

在 shell 中,将表名替换为 sed。

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

您可以查看新表。

sqlite3 dbfile '.schema newtable'

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

希望这个命令可以帮助你。


0
投票

sqlite> .schema

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

.schema 命令将为您提供关于表的结构,如何通过手动编程 SQLite 解释器、输入命令来制作它。

粘贴并执行,CREATE 块为表提供新名称:

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

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

sqlite> .tables
About     AboutToo

附注sqlite> 是启动 SQLite.exe 解释器后在控制台中出现的命令提示符。要获取它,请访问 www.sqlite.org


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", "[email protected]", "1234");
INSERT INTO mytable ( contact_id,first_name,last_name,email,phone ) VALUES ( 2, "Daisy", "Duck", "[email protected]", "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

进行一些字符串替换

0
投票

是的,通过使用 SQLiteStudio,您可以使用结构表中的最后一个图标,称为从任何现有表创建类似表。


0
投票

根据我的经验 \从 sqlite_master 中选择 sql,其中 type='table' AND name='mytable'\ 返回零记录。 但是,使用 LIKE 效果很好: \从 sqlite_master 中选择 sql,其中 type='table' 且名称类似于 'mytable'\

致以诚挚的问候


-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>

应具有与原始表相同的架构,但使用新名称。

© www.soinside.com 2019 - 2024. All rights reserved.