CHIL-ORACLE-创建表

1.创建表
2.创建表时的命名规则和注意事项
    
    1)表名和字段名的命名规则:必须以字母开头,可以含符号A-Z,a-z,0-9,_,$,#
    2)大小写不区分
    3)不用SQL里的保留字, 一定要用时可用双引号把字符串括起来.
    4)用和实体或属性相关的英文符号长度有一定的限制
    
    注意事项:
    1)建表时可以用中文的字段名, 但最好还是用英文的字段名
    2)创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面
    3)建表时如果有唯一关键字或者唯一的约束条件,建表时自动建了索引
    4)一个表的最多字段个数也是有限制的,254个
    
3.创建表语法
    CREATE?TABLE?[ schema.]table_name({
        column?datatype?[ DEFAULT?expr ]?
        [column_constraint]?...| table_constraint }?
        [,{?column?datatype?[ DEFAULT?expr ]?
           [ column_constraint ]...|table_constraint}?]...)?
           [[ PCTFREE??integer ]
       [ PCTUSED??integer ]
       [ INITRANS?integer ]?
       [ MAXTRANS?integer ]???????
       [ TABLESPACE?tablespace ]???????
       [ STORAGE?storage_clause ]?
       [ RECOVERABLE?|?UNRECOVERABLE?]?????
       [ PARALLEL?([DEGREE?{?integer?|?DEFAULT?}?]
       [ INSTANCES?{?integer?|?DEFAULT?}?])|?NOPARALLEL?]
       [ CACHE?|?NOCACHE?]?
       | [CLUSTER?cluster?(column?[,?column ]...)]?]
       [ ENABLE?enable_clause?|?DISABLE?disable_clause?]
       ...?
       [AS?subquery]
       
    字段注释:   
       Schema?--用来指定所建表的owner,如不指定则为当前登录的用户.?
       Table_name?--用来指定所创建的表名,最长为30个字符,但不可以数字开头(可为下划线),但不可同其它对象或Oracle的保留字冲突.????
       Column?--用来指定表中的列名,最多254个.?
       Datatype?--用来指定列中存储什么类型的数据,并保证只有有效的数据才可以输入.?
       column_constraint?--用来指定列约束,如某一列不可为空,则可指定为not?null.?
       table_constraint?--用来指定表约束,如表的主键,外键等.?
       Pctfree?--用来指定表中数据增长而在Oracle块中预留的空间.?DEFAULT为10%,也就是说该表的每个块只能使用90%,10%给数据行的增大时使用.?
       Pctused?--用来指定一个水帄线,当块中使用的空间低于该水帄线时才可以向该中加入新数据行.?
       Parallel?--用来指定为加速该表的全表扫描可以使用的并行查询进程个数.
       Cache?--用来指定该表为最应该缓存在SGA数据库缓冲池中的候选项.?
       Cluster?--用来指定该表所存储的?cluster.?
       Tablespace?--用来指定用数据库的那个分区来存储该表的数据.?
       Recoverable|Unrecoverable?--用来决定是否把对本表数据所作的变动写入Redo?文件.以恢复对数据的操作.?
       As?--当不指定表的各列时,可利用As子句的查询结果来产生数据库结构和数据.

4.ORACLE常用的字段类型
    VARCHAR2 (size) --可变长度的字符串, 必须规定长度
    CHAR(size) --固定长度的字符串, 不规定长度默认值为1
    NUMBER(p,s) --数字型p是位数总长度, s是小数的长度, 可存负数,最长38位. 不够位时会四舍五入.
    DATE --日期和时间类型
    LOB --超长字符, 最大可达4G
    CLOB --超长文本字符串
    BLOB --超长二进制字符串
    BFILE --超长二进制字符串, 保存在数据库外的文件里是只读的.
       
5.创建表例子?
??--例1:?
    create?table?region(
          id?decimal,
          myint?inteter)
    tablespace?user_data
    pctfree???5
    pctused???30;
    
    --例2:
    create?table?mytable2 as?(?select?*?from?mytable1);
    
6.创建表
    create table table_name (
        column datatype,
        [column datatype]
        .....  
     );
     
    tablespace tablespace_name 
    [ ppctfree integer ] 
    [ pctused integer ]
    [ initrans integer ]
    [ maxtrans integer ]
    storage( initial 200k next 200k ppctincrease 0 maxextents 50) [ logging | nologging ]  [ cache | nocaahe ]

7.复制一个已存在的表(copy an existing tablecreate table table_name 
    [ logging | nologging ] 
    as subquery

8.创建一个临时表(create temporary tablecreate global temporary table xay_temp as select * from xay;
   on commint preserve rows/on commit delete rows

9.pctfree 和 pctused 参数计算公式
   pctfree = (average row size - initial row size)*100/average row size
   pctused = 100-pctfree-(average row size * 100/available data space)

    pctfree : 指定表内每个数据块中空间的百分比。pctfree的值必须介于0和99之间。如果为零,表示可以通过插入新行来填充整个块。
        缺省值为10.此值表示每个块中保留着10%的空间,用于更新现有的行以及插入新行,每个块最多可以填充到90%

    pctused : 指定为表内每个数据块的已用空间的最小百分比。如果一个块的已用空间低于pctused,则可在该块中插入行。pctused的值介于0和99之间的整数,缺省值为40.

    结合pctfree 和 pctused 就可以确定将新行插入到现有数据块中,还是插入到新块中。这两个参数值的和必须小于或等于100.使用这两个参数可以更有效地利用表内的空间。

    设置 pctfree 和pctused
    pctfree 值越高,可为数据库块内的更新提供的空间就越大。如果表存在下面两种情况,则应设置一个更高的值:?某些列最初为null,后来更新为某个值? 
      某些列由于更新,大小可能增加pctfree的值越高,块密度就越低,即每个块容纳的行数就越少。上面的公式确保块中有足够的空间供行增长使用。
    pctused 以确保只有在具备足够空间来容纳一个平均大小的行时才将块返回到空闲列表中。
      如果空闲列表中的某个块没有足够的空间来插入一行,oracle服务器将查找空闲列表中的下个块、直到找到具备足够空间的块或者到达列表的末尾,这种线性扫描才会结束。
      使用给定的公式可以增加找到具有所有需空闲空间的块的概率,从而缩短扫描空闲列表时间。

    注:可以使用 analyze table 命令估算平均行大小的值。
    注:oracle9i “自动段空间管理” 功能可替代 pctused、freelists 和 freelist       groups.

10.改变存储和块利用率参数(change storage and block utilization parameter)
    alter table table_name pctfree=30 pctused=50 storage(next 500k minextents 2 maxextents 100);

11.手工分配区间(extents)(manually allxoating extents)
    alter table table_name allocate extent (size 500k datafile 'c:/oracle/data.dbf');

12.改变表的所属表空间(move tablespace)
    alter table employee move tablespace users;

13.释放表中未用空间(deallocate of unused spacealter table table_name deallocate unused [ keep integer ]

14.截断表(truncate)(truncate a tabletruncate table table_name;

   截断一个表将删除表中所有行,从而释放已使用的空间。
   对应的索引将被截断
   注:truncate table 不是DML语句,是DDL语句。另外truncate与delete的区别是吗,delete不释放空间,truncate释放空间。

15.删除表(drop a tabledrop table table_name [cascade constraints];

16.删除列(drop a cloumn)
    alter table table_name drop column commentd cascade constraints checkppoint 1000;
    or
    alter table table_name drop columns continue;

17.表示某一列为未使用(unused)(mark a column sa unused)
    alter table table_name set unused column comments xascade constraints;
    or
    alter table table_name dropp unused columns checkpoint 1000;
    or
    alter table orders drop columns continue checkpoint 1000 data_dictionary : dba_unused_col_tabs;

    除将列从表中删除以外,还可以先将列标记为 “未使用”,以后再删除。因为没有删除数据,所以此操作不回收磁盘空间,
    因而具有速度比较快的优点。被标为 “未使用” 的列可在以后系统活动较少时从表中删除。 

    未使用的列就像不属于表一样。查询时看不到未使用列中的数据。此外,在执行 DESCRIBE 命令时,
    也不会显示这些列的名称和数据类型。用户可以添加与未使用的列同名的新列。 

    如果想删除同一表中的两列,则可先将列设置为 “未使用” 然后再删除。在删除两列时,
    表中的所有行都会更新两次;但如果将这些列设置为 “未使用” 然后再删除,则所有的行仅更新一次。

 

posted @ 2017-03-07 10:02  CHIL  阅读(260)  评论(0编辑  收藏  举报