在同一个数据库 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 DATAWITH 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 中创建表的副本的主要内容,如果未能解决你的问题,请参考以下文章

如何在DB2建表空间

在 DB2 for Z/OS 中创建表分区

创建用于在 SQLce 数据库中创建表的 SQL 语句

防止用户在 H2 中创建表

ORACLE 创建表的SQL语句

DB2 建表,添加字段,删除字段,修改字段等常用操作