当前位置: 首页 > 面试题库 >

在oracle中创建现有表的完整副本

徐凌
2023-03-14
问题内容

我知道我可以轻松创建表的副本,create table t1 select * from table2;但是我需要复制:

  • columns
  • comments
  • tablespace
  • indexes
  • grants
  • triggers
  • keys
  • default values
  • any other dependencies

有办法通过pl/sql程序吗?我的Oracle版本是 11R2

表的SQL:

-- Create table

    create table SCHEMA.MY_TABLE
    (
      id      number(1),
      name    varchar2(30),
      dat     date
    )
    tablespace MY_TS
      pctfree 10
      initrans 1
      maxtrans 255
      storage
      (
        initial 10M
        next 1M
        minextents 1
        maxextents unlimited
      );
    -- Add comments to the table 
    comment on table SCHEMA.MY_TABLE
      is 'MY TABLE';
    comment on column SCHEMA.MY_TABLE.ID
      is 'id';
    comment on column SCHEMA.MY_TABLE.NAME
      is 'name of operation';
    comment on column SCHEMA.MY_TABLE.DAT
      is 'date of operation';

    grant select on SCHEMA.MY_TABLE to PUBLIC;

问题答案:

您可以使用DBMS_REDEFINITION包,该程序可以对整个表进行复制,包括注释等。它还可以对新副本进行“碎片整理”,以使其比原始表占用更少的空间。

有关更多信息,请访问https://docs.oracle.com/database/121/ARPLS/d_redefi.htm#ARPLS042

通过请求示例:

因此,让我们创建一个测试模式,一个表并向其中填充一些数据:

CREATE USER "TEST_SCHEMA" IDENTIFIED BY "TEST";
GRANT UNLIMITED TABLESPACE TO "TEST_SCHEMA";

CREATE TABLE "TEST_SCHEMA"."NAMES" ("ID" NUMBER, "NAME" VARCHAR2(25), PRIMARY KEY("ID"));

INSERT INTO "TEST_SCHEMA"."NAMES" VALUES (1, 'joe');
INSERT INTO "TEST_SCHEMA"."NAMES" VALUES (2, 'pete');
INSERT INTO "TEST_SCHEMA"."NAMES" VALUES (3, 'mark');

现在我们可以检查测试表的内容:

SELECT * FROM "TEST_SCHEMA"."NAMES";

让我们通过完全按照源表的样子创建一个空表来开始复制过程(使用WHERE 1=0,它将不接收任何数据)。

CREATE TABLE "TEST_SCHEMA"."NAMES_COPY" AS SELECT * FROM "TEST_SCHEMA"."NAMES" "A1" WHERE 1=0;

在这里,您可以设置并行化等,准备数据等。完成所有操作后,让我们开始REDEFINITION过程:

BEGIN
  DBMS_REDEFINITION.START_REDEF_TABLE('TEST_SCHEMA','NAMES','NAMES_COPY');
END;
/

复制内容时,我们需要复制依赖于表的每个对象(例如触发器,索引等)。

DECLARE
  num_errors PLS_INTEGER;
BEGIN
  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS ('TEST_SCHEMA',  'NAMES',    'NAMES_COPY',
    DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;
/

我们可以使用以下查询检查在复制依赖项期间是否发生任何错误:

SELECT "OBJECT_NAME", "BASE_TABLE_NAME", "DDL_TXT" FROM DBA_REDEFINITION_ERRORS;

如果一切正常,我们可以完成以下过程:

BEGIN
  DBMS_REDEFINITION.FINISH_REDEF_TABLE ('TEST_SCHEMA', 'NAMES',    'NAMES_COPY');
END;
/

瞧,新桌子就像克隆的绵羊多莉,里面有所有东西:

SELECT * FROM "TEST_SCHEMA"."NAMES_COPY";

现在,要删除测试模式,请运行以下命令:

DROP TABLE "TEST_SCHEMA"."NAMES";
DROP TABLE "TEST_SCHEMA"."NAMES_COPY";
DROP USER "TEST_SCHEMA" CASCADE;

希望对您有所帮助。



 类似资料:
  • 主要内容:Oracle CREATE TABLE语句简介,Oracle CREATE TABLE示例在本教程中,您将学习如何使用Oracle 语句在Oracle数据库中创建一个新表。 Oracle CREATE TABLE语句简介 要在Oracle数据库中创建一个新表,可以使用语句。下面说明了语句的基本语法: 在上面这个语法中, 首先,在子句中,指定新表所属的表名和模式名称。 其次,在圆括号内列出所有列。 如果一个表有多个列,则需要用逗号分隔每个列的定义。列定义包括列名,后跟它的数据类型,例如,

  • 用Java构建完整未来的最佳方式是什么?我已经实现了我自己的下面的< code>CompletedFuture,但希望像这样的东西已经存在。

  • 问题内容: 是否存在列注释语法,该语法允许我直接在创建表语句(即,内联)中声明列的位置指定列注释?该11克规范没有提到任何东西,在另一页中提到的东西,但我无法得到它的工作。创建表后有一种指定注释的方法,但是我认为将注释与字段定义分开很烦人。我正在寻找这样的东西(不起作用): 问题答案: 恐怕“烦人”的语法是这样做的唯一方法。SQL Server,PostgreSQL和DB2使用相同的语法(尽管据我

  • 我想列个这样的单子。请帮帮我.谢了。

  • 问题内容: 我想创建一个在不从现有的表中选择,而是具有插入到它的数据。当前,我正在创建一个表,然后在完成后将其删除。有没有一种方法可以有效地创建相同的对象?这是我当前的代码: 问题答案: 您可以通过从对偶中选择日期值并将它们结合在一起来创建公用表表达式(CTE,子查询分解等)。 与CTE无关,但是您可以通过使用日期文字来减少输入:

  • 本文向大家介绍如何在C#中创建Hashtable的浅表副本?,包括了如何在C#中创建Hashtable的浅表副本?的使用技巧和注意事项,需要的朋友参考一下 要创建Hashtable的浅表副本,代码如下- 示例 输出结果 这将产生以下输出- 示例 让我们看另一个例子- 输出结果 这将产生以下输出-