在同一个数据库 DB2 中创建表的副本
Posted
技术标签:
【中文标题】在同一个数据库 DB2 中创建表的副本【英文标题】:Create a copy of a table within the same database DB2 【发布时间】:2012-07-10 02:57:02 【问题描述】:是否有一种简单的方法可以将表复制到同一个数据库,当然名称不同。 我尝试了下面列出的一些,
db2 "CREATE TABLE SCHEMA.NEW_TB COPY AS SELECT * FROM SCHEMA.OLD_TB WHERE 1 = 2"
db2 "SELECT INTO SCHEMA.NEW_TB FROM SCHEMA.OLD_TB"
db2 "SELECT * FROM SCHEMA.OLD_TB INSERT INTO SCHEMA.NEW_TB"
这些都不起作用 我正在使用 db2 v9.5
【问题讨论】:
你为什么要为此使用 1 = 2 条件? 哦,好的,因为您不想复制数据,只需复制模式。很抱歉打扰你;) 【参考方案1】:您必须用括号将选择部分括起来。
CREATE TABLE SCHEMA.NEW_TB AS (
SELECT *
FROM SCHEMA.OLD_TB
) WITH NO DATA
应该可以。注意@Gilbert 所说的所有不会被复制的东西。
我假设这里是 Linux/Unix/Windows 上的 DB2,因为你说的是 DB2 v9.5。
【讨论】:
您的WHERE
条件有点奇怪。如果您使用错误谓词让 DB2 不复制数据,您可以像我在此处使用 WITH NO DATA
那样只复制结构。或者您可以直接发送CREATE TABLE SCHEMA.NEW_TB LIKE SCHEMA.OLD_TB
。
为什么“没有数据” 他不是也想复制内容吗?如何创建表格并进行插入?
@ThorstenNiehues 尽管没有WITH DATA
或WITH ALL DATA
选项,但你也不能省略WITH
子句。所以我们必须使用WITH NO DATA
(或LIKE
版本),然后使用单独的INSERT ... SELECT
查询输入数据。【参考方案2】:
试试这个:
CREATE TABLE SCHEMA.NEW_TB LIKE SCHEMA.OLD_TB;
INSERT INTO SCHEMA.NEW_TB (SELECT * FROM SCHEMA.OLD_TB);
未复制的选项包括:
检查约束 列默认值 列 cmets 外键 BLOB 列上的记录和压缩选项 不同的类型【讨论】:
INSERT INTO SCHEMA.NEW_TB(column names) SELECT column,names FROM SCHEMA.OLD_TB;某些表的列名位置不正确,这有助于解决该问题。 这不会复制主键和索引。知道怎么做吗?【参考方案3】:两个步骤都可以正常工作:
create table bu_x as (select a,b,c,d from x ) WITH no data;
insert into bu_x (a,b,c,d) select select a,b,c,d from x ;
【讨论】:
您能否确认第二步中的select select
正确且有意?
INSERT INTO XXX.YYY (SELECT * FROM ZZZ.TTT)
在 DB2 7 上为我工作【参考方案4】:
CREATE TABLE NEW_TABLENAME LIKE OLD_TABLENAME;
适用于 DB2 V 9.7
【讨论】:
它不会复制数据。 这个问题实际上并不清楚这个要求。接受的答案也不复制数据。【参考方案5】:我们可以将一个表中的所有列复制到另一个现有表中:
插入表 2 选择 * 从表 1;
或者我们可以只将我们想要的列复制到另一个现有的表中:
插入表 2 (列名) 选择列名 从表 1;
或从 TABLE1 中选择 * INTO BACKUP_TABLE1
【讨论】:
以上是关于在同一个数据库 DB2 中创建表的副本的主要内容,如果未能解决你的问题,请参考以下文章