有没有一种简单的方法可以将现有的表结构复制到新的表结构中?(不需要数据,只需要结构 -> 像 id INTEGER,name varchar(20) ...)
谢谢
你可以使用这样的命令:
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'
SQLite 无法克隆具有 PK、默认值和索引的表。
使用其他工具进行黑客攻击是必要的。
在 shell 中,将表名替换为 sed。
sqlite3 dbfile '.schema oldtable' | sed '1s/oldtable/newtable/' | sqlite3 dbfile
你可以检查新表。
sqlite3 dbfile '.schema newtable'
将保留主键、默认值和索引。
我希望这个命令可以帮助你。
sqlite> .schema
CREATE TABLE [About](
[id],
[name],
[value]);
.schema 命令将为您提供关于表的结构,如何通过手动编写 SQLite 解释器,输入命令来制作它。
粘贴并执行,为表提供新名称的 CREATE 块:
sqlite> CREATE TABLE [AboutToo](
[id],
[name],
[value]);
.tables 命令现在将显示您有两个“已复制”的新旧表。
sqlite> .tables
About AboutToo
ps sqlite> 是您在启动 SQLite.exe 解释器后进入控制台的命令提示符。要获得它,请访问 www.sqlite.org
仅作记录-这对我有用:
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
是的,通过使用 SQLiteStudio,您可以使用结构表中的最后一个图标,称为从任何现有表创建类似表。
我会选择 :
> 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>
应该具有与具有新名称的原始表相同的架构。