首页 > 数据库 > Oracle > oracle 表的管理
表是由行与列构成的,行与列中存放着数据。数据在存储的时候有自己的关系,存什么样的数据可以自由选择数据的类型。
想要在数据库中建表:
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/ ,如需转载,请注明出处,否则将追究法律责任。