oracle表结构

表管理

新建表

语法

create table 表名
(
    列名1 类型(长度),
    列名2 类型(长度),
    列名3 类型(长度)
);
  • create table:关键字,建表 后跟新建表的表名,表名长度有限制,不超过32位,以英文单词或者缩写组成,单词之间用下划线连接
  • 表名必须是数据库中唯一的,重复会报错.
  • 列名:英文单词缩写组成,长度不超过30位,不能以数字,下划线或特殊字符开头.单词之间以下划线连接.
  • 括号后须有分号结束;
SQL> create table stu_test
  2  (
  3  stu_id number(6),
  4  stu_name varchar2(50),
  5  stu_age number(3)
  6  );

表已创建。

添加注释

SQL> comment on table stu_test is '学生表';
注释已创建。

SQL> comment on column stu_test.stu_id is '学生编号';
注释已创建。

SQL> comment on column stu_test.stu_name is '学生姓名';
注释已创建。

SQL> comment on column stu_test.stu_age is '学生年龄';
注释已创建。
  • comment on table:关键字,即表的注释
  • comment on column:关键字,列的注释

复制表

复制表结构,不包含数据

复制表结构,不包含数据,也不包含索引,约束,注释

SQL> create table stu_test1 as
  2  select stu_id,stu_name from stu_test
  3  where 1=2;

表已创建。
复制表结构,包含数据

复制表结构,并包含数据,但不包括索引,约束,注释

SQL> create table stu_test2 as
  2  select stu_id,stu_name from stu_test
  3  where 1=1;

表已创建。

新建分区表

  • 分区原则:当数据量超过2000W时,可以考虑使用分区表
分区类型 类型描述
range: 按照范围分区,通常是按照时间字段分区,比如申请时间,入职时间
list: 按照分布分区,比如身份证号码最后一位
hash: 按照hash值分配分区,不保证是均匀分配

range分区范例

SQL> create table emp_info
  2  (
  3         emp_no number(10),
  4         join_date date
  5  )
  6  partition by range(join_date)
  7  (
  8            partition P1 values less than(to_date('20191120','YYYYMMDD')),
  9            partition P2 values less than(to_date('20191121','YYYYMMDD')),
 10            partition P3 values less than(to_date('20191122','YYYYMMDD')),
 11            partition P_MAX values less than(maxvalue)
 12  );

表已创建。
关键字 描述
partition by 指明是分区表,range确定分区方式,join_date是分区键,必须是表中的一列
partition 后跟分区名字,分区名字必须全库唯一,不能重复
values less than 即当分区键的值小于其后的值时,数据落入本分区
maxvalue 用于最大分区

当插入数据的join_date时间日期小于20日,放入p1分区
当时间日期大于22放入P_MAX

list分区范例

SQL> create table LIST_TAB_TEST
  2  (
  3         id_no number(10),
  4         partition_id varchar2(2)
  5  )
  6  partition by list(partition_id)
  7  (
  8            partition P_0 values('0'),
  9            partition P_1 values('1'),
 10            partition P_2 values('2'),
 11            partition P_default values(default)
 12  );

表已创建。
关键字 描述
values: 即值是. 表示当分区键的值是其后的值时,数据落入本分区
default: 关键字,默认值,当分区键的值不在之前分区值内时,数据落入本分区

查询每个分区的数据

语法

select * from 表名 partition(分区名);
SQL> insert into emp_info
  2  values(1,sysdate);
已创建 1 行。

SQL> select * from emp_info partition(p3);
    EMP_NO JOIN_DATE
---------- --------------
         1 21-11月-19
SQL> insert into list_tab_test
  2  values(1,6);
已创建 1 行。

SQL> select * from list_tab_test partition(P_default);
     ID_NO PART
---------- ----
         1 6

查看分区建select * from dba_part_key_columns where owner='SCOTT';

删除表

SQL> drop table emp_info;
表已删除。

SQL> drop table list_tab_test;
表已删除。

增加列

SQL> create table student6
  2  (
  3  id number primary key
  4  );

表已创建。

增加单列

SQL> alter table student6
  2  add s_mpno number(6);

表已更改。

增加多列

SQL> alter table student6
  2  add(s_name varchar2(50),s_deptno number(2));

表已更改。

修改表列的名称和属性

修改表名和列名

修改表名

SQL> alter table student6 rename to student_6;

表已更改。

修改列名

SQL> alter table student_6 rename column id to s_id;

表已更改。

修改列的属性

将s_id的number改为number(6)

SQL> alter table student_6 modify s_id number(6);

表已更改。

将s_mpno设置为唯一的,s_name设置为非空的

SQL> alter table student_6
  2  modify(s_mpno number(6) unique,
  3  s_name varchar2(50) not null);

表已更改。

已有数据情况下,更改列的属性

将stu_info表的stu_no列属性由number改为varchar2

SQL> select * from stu_info;

    STU_NO  STU_NAME         STU_AGE
      -------    -------- ---
      1 张三              50
      2 李四              50
      3 王五              51
方法1,将stu_no列清空,然后修改类型,最后数据恢复

第一步,清空数据,但数据不能丢失

SQL> alter table stu_info  add stu_no1 number(20);
表已更改。

SQL> update stu_info set stu_no1=stu_no;
已更新3行。

SQL> update stu_info set stu_no=null;
已更新3行。

SQL> commit;
提交完成。

SQL> select * from stu_info;

    STU_NO   STU_NAME   STU_AGE        STU_NO1
---------- -------------- -------------- ----------
             张三     50               1
             李四     50               2
             王五     51               3

第二步,修改类型

SQL> alter table stu_info modify stu_no varchar(10);

表已更改。

第三步,将数据恢复,并将新增列删除

SQL> update stu_info set stu_no=stu_no1;
已更新3行。

SQL> alter table stu_info drop column stu_no1;
表已更改。

删除列

删除单列

SQL> alter table stu_info drop column stu_no;

表已更改。

删除多列

SQL> alter table student_6 drop(s_mpno,s_deptno);

表已更改。

猜你喜欢

转载自www.cnblogs.com/inmeditation/p/11957359.html