ITPub博客

首页 > 数据库 > Oracle > oracle 表的管理

oracle 表的管理

Oracle 作者:下一站在哪 时间:2014-06-05 11:35:25 0 删除 编辑

  表是由行与列构成的,行与列中存放着数据。数据在存储的时候有自己的关系,存什么样的数据可以自由选择数据的类型。

  想要在数据库中建表:

  1、需要有建表的权限—create table

  2、需要有存储空间使用权限—storage space

  3、想要给其他用户建表也需要权限---create any table

  4、表名的长度必读在30个字符之内

  5、不能使用oracle中的一些保留字如(table、user)

  6、在非中文的情况下表名必须由A到Z之间的字母开头,郑州牛皮癣医院一般情况下不使用中文(如果不想用A到Z之间字母开头,应加上“” 如:

  “地理位置”, 在表名中有空格与特殊的字符,也应该加“”)。

  不是以字母A到Z开头的

  SQL> create table 5yd(id number,name varchar2(10));

  create table 5yd(id number,name varchar2(10))

  *

  ERROR at line 1:

  ORA-00903: invalid table name

  SQL>

  加上“”创建表

  SQL> create table "5yd"(id number,name varchar2(10));

  Table created.

  SQL>

  SQL> create table "地理位置"(id number,name varchar2(10));

  Table created.

  SQL>

  表的列名:

  1、列的长度必须在30个字符之内

  2、也是必须使用字母A到Z之间开头。

  创建表

  Create table schema.table_name

  (列名1 类型(长度) 列约束,

  列名2 类型(长度) 列约束……表约束)

  创建表的一些定义

  Pctfree n -----指定表的每一个数据库为update操作所保留的空间百分比,默认为10

  Pctused n ------指定在数据库上可以重新插入数据的已用空间最低百分比

  Initrans n

  Maxtrans n -------指定可以同时对表所有块进行更新操作的最小和最大的事务数

  Tablespace tbname -----将所创建的表部署到规定的表空间中

  Storage(

  Initial n ------指定表第一个区的大小

  Next n-------指定初始扩展区大小

  Minextents n

  Maxextents n -----指定为表的段分配的区数的最大值和最小值

  Pctincrease n ----指定扩展区递增的百分比

  Buffer_pool ---指定默认使用哪个数据缓冲区

  )

  登录用户查看所具备权限

  SQL> conn u1/u1

  Connected.

  SQL> select * from session_privs;

  PRIVILEGE

  ----------------------------------------

  CREATE SESSION

  UNLIMITED TABLESPACE

  CREATE TABLE

  CREATE ANY TABLE

  ALTER ANY TABLE

  DROP ANY TABLE

  SELECT ANY TABLE

  CREATE CLUSTER

  CREATE SEQUENCE

  CREATE PROCEDURE

  CREATE TRIGGER

  PRIVILEGE

  ----------------------------------------

  CREATE TYPE

  CREATE OPERATOR

  CREATE INDEXTYPE

  14 rows selected.

  SQL>

  SQL> create table tt1(id number,name varchar2(10));

  Table created.

  SQL>

  建立表tt2 使用keep池缓存表tt2的数据

  SQL> create table tt2(id number) storage(buffer_pool keep);

  Table created.

  SQL>

  为了避免SGA抖动,设置 keep池大小

  SQL> conn / as sysdba

  Connected.

  SQL> show parameter db_keep_cache_size

  NAME TYPE VALUE

  ------------------------------------ ----------- ------------------------------

  db_keep_cache_size big integer 0

  SQL> alter system set db_keep_cache_size=30m;

  估算表占用空间大小

  [oracle@dongyang ~]$ vi /tmp/essize.sql

  set serveroutput on

  DECLARE

  ub NUMBER;

  ab NUMBER;

  cl sys.create_table_cost_columns;

  BEGIN

  cl := sys.create_table_cost_columns( sys.create_table_cost_colinfo('NUMBER',10),

  sys.create_table_cost_colinfo('VARCHAR2',30),

  sys.create_table_cost_colinfo('VARCHAR2',30),

  sys.create_table_cost_colinfo('DATE',NULL));

  DBMS_SPACE.CREATE_TABLE_COST('SYSTEM',cl,1000000,0,ub,ab); --根据情况设置数据量

  DBMS_OUTPUT.PUT_LINE('Used MB: ' || TO_CHAR(ub/1024/1024));

  DBMS_OUTPUT.PUT_LINE('Alloc MB: ' || TO_CHAR(ab/1024/1024));

  END;

  /

  SQL> @/tmp/essize.sql

  Used MB: 50.40625

  Alloc MB: 51

  PL/SQL procedure successfully completed.

  SQL>

  修改表的列名

  10g之后推出的功能

  SQL> desc tt1

  Name Null? Type

  ----------------------------------------- -------- ----------------------------

  ID NUMBER

  NAME VARCHAR2(10)

  SQL>

  SQL> alter table tt1 rename column id to tpid; (未执行结束前,郑州牛皮癣专科医院会影响到对表的DML语句)

  Table altered.

  SQL>

  SQL> desc tt1

  Name Null? Type

  ----------------------------------------- -------- ----------------------------

  TPID NUMBER

  NAME VARCHAR2(10)

  SQL>

  通过联机重定义来修改将tpid改为eid

  先授予普通用户相应权限

  SQL> conn / as sysdba

  Connected.

  SQL> grant execute on dbms_redefinition to u1;

  Grant succeeded.

  SQL> grant create any table to u1;

  Grant succeeded.

  SQL> grant lock any table to u1;

  Grant succeeded.

  SQL> grant create any index to u1;

  Grant succeeded.

  SQL> grant create any trigger to u1;

  Grant succeeded.

  SQL>

  进入普通用户,做表的统计信息

  SQL> desc tt1;

  Name Null? Type

  ----------------------------------------- -------- ----------------------------

  TPID NUMBER

  NAME VARCHAR2(10)

  SQL> select count(*) from tt1;

  COUNT(*)

  ----------

  32768

  SQL>

  SQL> exec dbms_stats.gather_table_stats('U1','TT1');

  PL/SQL procedure successfully completed.

  SQL>

  创建tt1_n表得到tt1表结构并改变列名

  SQL> create table tt1_n as select tpid eid,name from tt1 where 0=1;

  Table created.

  SQL>

  SQL> exec dbms_redefinition.can_redef_table('U1','TT1');

  BEGIN dbms_redefinition.can_redef_table('U1','TT1'); END;

  *

  ERROR at line 1:

  ORA-12089: cannot online redefine table "U1"."TT1" with no primary key

  ORA-06512: at "SYS.DBMS_REDEFINITION", line 137

  ORA-06512: at "SYS.DBMS_REDEFINITION", line 1478

  ORA-06512: at line 1

  (我建的表内容有重复的,并且没有主键)

  SQL>

  创建以rownum为主键 的表

  SQL> create table tt11 as select rownum id, tpid,name from tt1;

  Table created.

  SQL>

  删除原表

  SQL> drop table tt1 purge;

  Table dropped.

  SQL>

  重命名为原表

  SQL> rename tt11 to tt1;

  Table renamed.

  创建主键

  SQL> alter table tt1 modify(id primary key);

  Table altered.

  SQL>

  SQL> desc tt1;

  Name Null? Type

  ----------------------------------------- -------- ----------------------------

  ID NOT NULL NUMBER

  TPID NUMBER

  NAME VARCHAR2(10)

  SQL>

  删除表tt1_n创建tt1_n表得到tt1表结构并改变列名

  SQL> drop table tt1_n purge;

  Table dropped.

  SQL>

  SQL> create table tt1_n as select id,name,tpid eid from tt1 where 0=1;

  Table created.

  SQL>

  重新获取统计信息与扫描

  SQL> exec dbms_stats.gather_table_stats('U1','TT1');

  PL/SQL procedure successfully completed.

  SQL> exec dbms_redefinition.can_redef_table('U1','TT1');

  PL/SQL procedure successfully completed.

  SQL>

  使用START_REDEF_TABLE过程转换列名

  SQL> begin

  2 dbms_redefinition.start_redef_table('U1','TT1','TT1_N','id id,tpid eid,name name');

  3 end;

  4 /

  /

  PL/SQL procedure successfully completed.

  SQL>

  使用COPY_TABLE_DEPENDENTS过程同步表tt1_n

  http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_redefi.htm#i999656 (COPY_TABLE_DEPENDENTS过程官方详解)

  SQL> var num number

  SQL> begin

  2dbms_redefinition.copy_table_dependents('U1','TT1','TT1_N',dbms_redefinition.cons_orig_params,true,true,true,true,:num,true);

  3 end;

  4 /

  /

  PL/SQL procedure successfully completed.

  SQL>

  打印下函数,看是否有错误

  SQL> print num

  NUM

  ----------

  1

  SQL>

  统计两表的行

  SQL> select count(*) from tt1;

  COUNT(*)

  ----------

  32768

  SQL> select count(*) from tt1_n;

  COUNT(*)

  ----------

  32768 (已同步)

  SQL>

  使用FINISH_REDEF_TABLE过程将tt1表的郑州牛皮癣医院结构转换为tt1_n 表的结构

  http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_redefi.htm#i998731

  SQL> exec dbms_redefinition.finish_redef_table('U1','TT1','TT1_N');

  PL/SQL procedure successfully completed.

  SQL> desc tt1;

  Name Null? Type

  ----------------------------------------- -------- ----------------------------

  ID NUMBER

  NAME VARCHAR2(10)

  EID NUMBER

  发现已变更

  SQL>

  删除同步表

  SQL> drop table tt1_n purge;

  Table dropped.

  SQL>

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29661313/viewspace-1176108/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-05-16

  • 博文量
    24
  • 访问量
    43694