首页 > 代码库 > Oracle创建表空间和表
Oracle创建表空间和表
oracle建表、建主键、外键基本语法
-创建表格语法:
create table 表名(
字段名1 字段类型(长度) 是否为空,
字段名2 字段类型 是否为空 );
-增加主键
alter table 表名 add constraint 主键名 primary key (字段名1);
-增加外键:
alter table 表名 add constraint 外键名 foreign key (字段名1) references 关联表 (字段名2);
在建立表格时就指定主键和外键
create table T_STU
(
STU_ID char(5) not null,
STU_NAME VARCHAR2(8) not null,
constraint PK_T_STU primary key (STU_ID)
);
主键和外键一起建立:
create table T_SCORE(
EXAM_SCORE number(5,2),
EXAM_DATE date,
AUTOID number(10) not null,
STU_ID char(5),
SUB_ID char(3),
constraint PK_T_SCORE primary key (AUTOID),
constraint FK_T_SCORE_REFE foreign key (STU_ID) references T_STU (STU_ID),
);
ORACLE常用字段类型:
VARCHAR2 (size): 可变长度的字符串, 必须规定长度
CHAR(size): 固定长度的字符串, 不规定长度默认值为1
NUMBER(p,s) :数字型p是位数总长度, s是小数的长度, 可存负数
DATE :日期和时间类型
orale数据类型:
类型 | 含义 |
CHAR(length) | 存储固定长度的字符串。参数length指定了长度,如果存储的字符串长度小于length,用空格填充。默认长度是1,最长不超过2000字节。 |
VARCHAR2(length) | 存储可变长度的字符串。length指定了该字符串的最大长度。默认长度是1,最长不超过4000字符。 |
NUMBER(p,s) | 既可以存储浮点数,也可以存储整数,p表示数字的最大位数(如果是小数包括整数部分和小数部分和小数点,p默认是38为),s是指小数位数。 |
DATE | 存储日期和时间,存储纪元、4位年、月、日、时、分、秒,存储时间从公元前4712年1月1日到公元后4712年12月31日。 |
TIMESTAMP | 不但存储日期的年月日,时分秒,以及秒后6位,同时包含时区。 |
CLOB | 存储大的文本,比如存储非结构化的XML文档 |
BLOB | 存储二进制对象,如图形、视频、声音等。 |
2. 创建表时给字段加默认值 和约束条件
创建表时可以给字段加上默认值 例如 : 日期字段 DEFAULT SYSDATE 这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间
创建表时可以给字段加上约束条件 例如: 非空 NOT NULL ,不允许重复 UNIQUE ,关键字 PRIMARY KEY ,按条件检查 CHECK (条件), 外键 REFERENCES 表名(字段名)
3. 创建表的例子
create table DEPT(
DNAME varchar2(14),
LOC varchar2(6),
EPTNO number(2) constraint PK_DEPT primary KEY,
);
create table region(
ID number(2) not null primary KEY,
postcode number(6) default ‘0‘ not null,
areaname varchar2(30) default ‘‘ not null,
);
4. 创建表时的命名规则和注意事项
1)表名和字段名的命名规则:必须以字母开头,可以含符号A-Z,a-z,0-9,_,$,#
2)大小写不区分
3)不用SQL里的保留字, 一定要用时可用双引号把字符串括起来
4)用和实体或属性相关的英文符号长度有一定的限制
5)约束名的命名规则和语法 约束名的命名规则约束名如果在建表的时候没有指明,系统命名规则是SYS_Cn(n是数字) 约束名字符串的命名规则同于表和字段名的命名规则
6)使用约束时的注意事项 约束里不能用系统函数,如SYSDATE和别的表的字段比较 可以用本表内字段的比较
注意事项:
1)建表时可以用中文的字段名, 但最好还是用英文的字段名
2)创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面
3)建表时如果有唯一关键字或者唯一的约束条件,建表时自动建了索引
4)一个表的最多字段个数也是有限制的,254个.
想在事务处理后, 做约束的
检查 SQL> alter session set constraints deferred.
7. 由实体关系图到创建表的例子 s_dept 前提条件:已有region表且含唯一关键字的字段id SQL> CREATE TABLE s_dept (id NUMBER(7) CONSTRAINT s_dept_id_pk PRIMARY KEY, name VARCHAR2(25) CONSTRAINT s_dept_name_nn NOT NULL, region_id NUMBER(7) CONSTRAINT s_dept_region_id_fk REFERENCES region (id), CONSTRAINT s_dept_name_region_id_uk UNIQUE(name, region_id));
8. 较复杂的创建表例子 SQL> CREATE TABLE s_emp (id NUMBER(7) CONSTRAINT s_emp_id_pk PRIMARY KEY, last_name VARCHAR2(25) CONSTRAINT s_emp_last_name_nn NOT NULL, first_name VARCHAR2(25), userid VARCHAR2(8) CONSTRAINT s_emp_userid_nn NOT NULL CONSTRAINT s_emp_userid_uk UNIQUE, start_date DATE DEFAULT SYSDATE, comments VARCHAR2(25), manager_id NUMBER(7), title VARCHAR2(25), dept_id NUMBER(7) CONSTRAINT s_emp_dept_id_fk REFERENCES s_dept(id), salary NUMBER(11,2), commission_pct NUMBER(4,2) CONSTRAINT s_emp_commission_pct_ck CHECK (commission_pct IN(10,12.5,15,17.5,20)));
8. 通过子查询建表 通过子查询建表的例子 SQL>CREATE TABLE emp_41 AS SELECT id, last_name, userid, start_date FROM s_emp WHERE dept_id = 41;
SQL> CREATE TABLE A as select * from B where 1=2; 只要表的结构.
10. 用子查询建表的注意事项 1)可以关连多个表及用集合函数生成新表,注意选择出来的字段必须有合法的字段名称,且不能重复。 2)用子查询方式建立的表,只有非空NOT NULL的约束条件能继承过来, 其它的约束条件和默认值都没有继承过来. 3)根据需要,可以用alter table add constraint ……再建立其它的约束条件,如primary key等.
11. Foreign Key的可选参数ON DELETE CASCADE 在创建Foreign Key时可以加可选参数: ON DELETE CASCADE它的含义是如果删除外键主表里的内容,子表里相关的内容将一起被删除. 如果没有ON DELETE CASCADE参数,子表里有内容,父表里的主关键字记录不能被删除掉.
12. 如果数据库表里有不满足的记录存在,建立约束条件将不会成功.
13. 给表创建和删除同义词的例子 SQL> CREATE SYNONYM d_sum 2 FOR dept_sum_vu;
SQL> CREATE PUBLIC SYNONYM s_dept 2 FOR alice.s_dept;
SQL> DROP SYNONYM s_dept;
ORACLE之新建表
创建一个名为INSURES的表
create table INSURES
(
INSURE_NO CHAR(18) not null, --医保号
GETSURE_UNIT_NO CHAR(9) not null, --经办机构号
INSURE_NAME VARCHAR2(10) not null, --姓名
INSURE_SEX CHAR(1) not null, --性别
ID_CARD_NO CHAR(18) not null, --身份证号
);
给该表字段添加注释
comment on column INSURES.INSURE_NO
is ‘医保号‘;
创建/修改主键,唯一性约束和外键 这里INSURE_NO, GETSURE_UNIT_NO唯一性约束
alter table INSURES
add constraint UNQ_INSURES unique (INSURE_NO, GETSURE_UNIT_NO)
alter table TWN_SEED
add constraint UNQ_INSURES primary key (。。。。)
创建索引
create index IDX_INSURES on INSURES (GETSURE_UNIT_NO, SONSURE_UNIT_NO, UNIT_NO, FAMILY_NO, HOSPS_NO)
创建一个PK的时候,是自动创建一个与之对应的唯一索引的。 如果不特别指定,那么这个索引的表空间和表格的空间是一样的,但是我们不建议放在一起。
create table testone(
name varchar2(10 char))
TABLESPACE1;
ALTER TABLE TESTONE ADD CONSTRAINT PK_TESTONE1 PRIMARY KEY(NAME) USING INDEX TABLESPACE TABLESPACE2;
作为一种好习惯,不要把索引和表格的数据存在在同一个表空间中
Oracle创建表语法 - create
--(2)创建带有主键约束的表语法 create table 表名 ( 字段名1(列名) 数据类型 列的特征, 字段名2 数据类型 列的特征(NOT NULL), ...... primary key(主键列字段)
)
--(3)利用现有的表创建表 -- 注意:仅复制Oracle数据表结构:采用的是子查询方式 create table 新表 as select * from 旧的表 where 1=2
--(4)利用现有的表的结构创建新表 -- 注意:仅复制Oracle数据表结构:采用的是子查询方式 create table 新表 select 字段1,字段2... from 旧的表 where 条件(旧的表字段满足的条件)
--(5)利用现有的表的结构创建新表 -- 注意:复制Oracle数据表数据 create table 新表 as select * from 旧的表 where 1=1
--(6)利用现有的表的结构创建新表 -- 注意:复制Oracle数据表数据 create table 新表 as select 字段1,字段2... from 旧的表 where 条件(旧的表字段满足的条件)
--(7)将查询结果插入另一张表 insert into 另一张表 select * from 要查询的表 where 条件(要查询的表的列符合什么条件)
- //建测试表
- create table dept(
- deptno number(3) primary key,
- dname varchar2(10),
- loc varchar2(13)
- );
- create table employee_info(
- empno number(3),
- deptno number(3),
- ename varchar2(10),
- sex char(1),
- phone number(11),
- address varchar2(50),
- introduce varchar2(100)
- );
- --
- //0.重命名
- //0.1 表:rename dept to dt;
- rename dt to dept;
- //0.2 列:alter table dept rename column loc to location;
- alter table dept rename column location to loc;
- //1.添加约束
- //1.1 primary key
- alter table employee_info add constraint pk_emp_info primary key(empno);
- //1.2 foreign key
- alter table employee_info add constraint fk_emp_info foreign key(deptno)
- references dept(deptno);
- //1.3 check
- alter table employee_info add constraint ck_emp_info check
- (sex in (‘F‘,‘M‘));
- //1.4 not null
- alter table employee_info modify phone constraint not_null_emp_info not null;
- //1.5 unique
- alter table employee_info add constraint uq_emp_info unique(phone);
- //1.6 default
- alter table employee_info modify sex char(2) default ‘M‘;
- //2.添加列
- alter table employee_info add id varchar2(18);
- alter table employee_info add hiredate date default sysdate not null;
- //3.删除列
- alter table employee_info drop column introduce;
- //3.修改列
- //3.1 修改列的长度
- alter table dept modify loc varchar2(50);
- //3.2 修改列的精度
- alter table employee_info modify empno number(2);
- //3.3 修改列的数据类型
- alter table employee_info modify sex char(2);
- //3.4 修改默认值
- alter table employee_info modify hiredate default sysdate+1;
- //4.禁用约束
- alter table employee_info disable constraint uq_emp_info;
- //5.启用约束
- alter table employee_info enable constraint uq_emp_info;
- //6.延迟约束
- alter table employee_info drop constraint fk_emp_info;
- alter table employee_info add constraint fk_emp_info foreign key(deptno)
- references dept(deptno)
- deferrable initially deferred;
- //7.向表中添加注释
- comment on table employee_info is ‘information of employees‘;
- //8.向列添加注释
- comment on column employee_info.ename is ‘the name of employees‘;
- comment on column dept.dname is ‘the name of department‘;
- //9.清除表中所有数据
- truncate table employee_info;
- //10.删除表
- drop table employee_info;
- --
- //下面来看看刚刚才我们对表dept和表employee_info所做的更改
- //user_constraints视图里面包含了刚刚才我们创建的所有约束,以及其他信息,
- //你可以用desc user_constraints命令查看其详细说明
- select constraint_name,constraint_type,status,deferrable,deferred
- from user_constraints
- where table_name=‘EMPLOYEE_INFO‘;
- --
- CONSTRAINT_NAME CONSTRAINT_TYPE STATUS DEFERRABLE DEFERRED
- ------------------------------ --------------- -------- -------------- ---------
- PK_EMP_INFO P ENABLED NOT DEFERRABLE IMMEDIATE
- FK_EMP_INFO R ENABLED DEFERRABLE DEFERRED
- NOT_NULL_EMP_INFO C ENABLED NOT DEFERRABLE IMMEDIATE
- SYS_C005373 C ENABLED NOT DEFERRABLE IMMEDIATE
- UQ_EMP_INFO U ENABLED NOT DEFERRABLE IMMEDIATE
- CK_EMP_INFO C ENABLED NOT DEFERRABLE IMMEDIATE
- //我们可以通过user_cons_columns视图查看有关列的约束信息;
- select owner,constraint_name,table_name,column_name
- from user_cons_columns
- where table_name=‘EMPLOYEE_INFO‘;
- --
- OWNER CONSTRAINT_NAME TABLE_NAME COLUMN_NAME
- ------------------------------ ------------------------------ ------------------------------ ---------------
- YEEXUN PK_EMP_INFO EMPLOYEE_INFO EMPNO
- YEEXUN CK_EMP_INFO EMPLOYEE_INFO SEX
- YEEXUN NOT_NULL_EMP_INFO EMPLOYEE_INFO PHONE
- YEEXUN SYS_C005373 EMPLOYEE_INFO HIREDATE
- YEEXUN UQ_EMP_INFO EMPLOYEE_INFO PHONE
- YEEXUN FK_EMP_INFO EMPLOYEE_INFO DEPTNO
- //我们将user_constraints视图与user_cons_columns视图连接起来
- //查看约束都指向哪些列
- column column_name format a15;
- select ucc.column_name,ucc.constraint_name,uc.constraint_type,uc.status
- from user_constraints uc,user_cons_columns ucc
- where uc.table_name=ucc.table_name and
- uc.constraint_name=ucc.constraint_name and
- ucc.table_name=‘EMPLOYEE_INFO‘;
- --
- COLUMN_NAME CONSTRAINT_NAME CONSTRAINT_TYPE STATUS
- --------------- ------------------------------ --------------- --------
- EMPNO PK_EMP_INFO P ENABLED
- DEPTNO FK_EMP_INFO R ENABLED
- PHONE NOT_NULL_EMP_INFO C ENABLED
- HIREDATE SYS_C005373 C ENABLED
- PHONE UQ_EMP_INFO U ENABLED
- SEX CK_EMP_INFO C ENABLED
- --
- //这里有个constraint_type,他具体指下面几种类型:
- //C:check,not null
- //P:primary key
- //R:foreign key
- //U:unique
- //V:check option
- //O:read only
- --
- //我们可以通过user_tab_comments视图获得对表的注释
- select * from user_tab_comments
- where table_name=‘EMPLOYEE_INFO‘;
- TABLE_NAME TABLE_TYPE COMMENTS
- ------------------------------ ----------- --------------------------
- EMPLOYEE_INFO TABLE information of employees
- --
- //我们还可以通过user_col_comments视图获得对表列的注释:
- select * from user_col_comments
- where table_name=‘EMPLOYEE_INFO‘;
- --
- TABLE_NAME COLUMN_NAME COMMENTS
- ------------------------------ ------------------------------ ---------------------------
- EMPLOYEE_INFO EMPNO
- EMPLOYEE_INFO DEPTNO
- EMPLOYEE_INFO ENAME the name of employees
- EMPLOYEE_INFO SEX
- EMPLOYEE_INFO PHONE
- EMPLOYEE_INFO ADDRESS
- EMPLOYEE_INFO ID
- EMPLOYEE_INFO HIREDATE
- --
- select * from user_col_comments
- where table_name=‘EMPLOYEE_INFO‘ and
- comments is not null;
- --
- TABLE_NAME COLUMN_NAME COMMENTS
- ------------------------------ ------------------------------ ------------------------
- EMPLOYEE_INFO ENAME the name of employees
- --
- //最后我们来查看一下修改后的表:
- desc employee_info;
- Name Type Nullable Default Comments
- -------- ------------ -------- --------- ---------------------
- EMPNO NUMBER(2)
- DEPTNO NUMBER(3) Y
- ENAME VARCHAR2(10) Y the name of employees
- SEX CHAR(2) Y ‘M‘
- PHONE NUMBER(11)
- ADDRESS VARCHAR2(50) Y
- ID VARCHAR2(18) Y
- HIREDATE DATE sysdate+1
- --
- desc dept;
- Name Type Nullable Default Comments
- ------ ------------ -------- ------- ----------------------
- DEPTNO NUMBER(3)
- DNAME VARCHAR2(10) Y the name of department
- LOC VARCHAR2(50) Y
*下面讲解上面命令的各方面的含义 create table test_user --创建数据表 no number(5) not null , --pk (列名或字段名) 数据类型(数据长度) 该数据列不能为空 ,是列之间的分隔符 --后的内容是注释 constraint pk_connectdb primary key(no) (约束) 约束名 (主键) (列名) 意思就是 在数据表 test_user中所有行数据 no的值不能相同(这就是主键的含义)
storage (initial 10k next 10k pctincrease 0); 这个说起来比较复杂, 反正如果某个数据表要存放大量数据,就把initial和next后的值设置大一点, 否则设置小一点.
既然上面在创建数据表中没有特别指定 表空间,当然该表就存放在study缺省表空间data_test了.
create tablespace data_phonepos datefile ‘d:\install\OracleXpdb\datafilephonepos.dbf‘ size 8000M; create user phonepos identified by phonepos default tablespace data_phonepos;
grant connect, resource to phonepos; grant dba to phonepos;
权限的查询
5.1 查询某个用户授予其他用户在当前用户模式下的对象权限 select * from user_tab_privs_made --假如当前用户为WENZI,那么查询结果就是由WENZI授权,在WENZI模式下的权限记录
5.2 查询某个用户授予其他用户在该用户模式对象及其他模式对象上的对象权限 select * from all_tab_privs_made -- 假如当前登录用户为WENZI,那么查询结果就是所有由WENZI授予的权限的记录
修改用户
ALTER USER avyrros IDENTIFIED EXTERNALLY DEFAULT TABLESPACE data_ts TEMPORARY TABLESPACE temp_ts QUOTA 100M ON data_ts QUOTA 0 ON test_ts PROFILE clerk;
删除用户 DROP USER username [CASCADE] --CASECADE 选项会删除该用户模式下的所有对象,建议在删除前,先确认是否有其他的依赖关系存在。
查询属于用户的对象 select owner,object_name,object_type,status from dba_objects where owner=‘WENZI‘
5.3 查询为某个用户授予的,在其他模式对象上的权限 select * from user_tab_privs_recd --假如当前登录用户为WENZI,那么查询结果就是WENZI在其他模式对象上的权限
5.4 查询为某个用户授予的,在该用户模式对象与其他模式对象上的权限 select * from all_tab_privs_recd --假如当前用户为wenzi,则查询结果为wenzi在整个数据库中拥有权限的对象
角色管理
创建口令文件 orapwd file=‘..........\pwd{SID}.ora‘ password=‘***(sys的密码)‘ tntries=10(口令文件最大的用户数量)
要使某个用户可以使用口令文件,必须为其授予SYSDBA权限,系统会自动将其加入到口令文件中。 grant sysdba to wenzi 当收回SYSDBA权限时,系统将对应的用户从口令文件中删除。 revoke sysdba from wenzi
查看口令文件管理的用户 select * from v$pwfile_users
SQL> conn sys/h1w2D3B4 as sysdba
SQL> startup
[user@root ~]$ lsnrctl start
// 分为四步
//第1步:创建临时表空间
create temporary tablespace user_temp
tempfile ‘D:\oracle\oradata\Oracle9i\user_temp.dbf‘
size 50m
autoextend on
next 50m maxsize 20480m
extent management local;
//第2步:创建数据表空间
create tablespace user_data
logging
datafile ‘D:\oracle\oradata\Oracle9i\user_data.dbf‘
size 50m
autoextend on
next 50m maxsize 20480m
extent management local;
//第3步:创建用户并指定表空间
create user username identified by password
default tablespace user_data
temporary tablespace user_temp;
//第4步:给用户授予权限
grant connect,resource to username;
---------------------------------------------------------------------------------
//以后以该用户登录,创建的任何数据库对象都属于user_temp 和user_data表空间,
这就不用在每创建一个对象给其指定表空间了
撤权:
revoke 权限... from 用户名;
删除用户命令
drop user user_name cascade;
建立表空间
CREATE TABLESPACE data01
DATAFILE ‘/oracle/oradata/db/DATA01.dbf‘ SIZE 500M
UNIFORM SIZE 128k; #指定区尺寸为128k,如不指定,区尺寸默认为64k
删除表空间
DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;
一、建立表空间
CREATE TABLESPACE data01
DATAFILE ‘/oracle/oradata/db/DATA01.dbf‘ SIZE 500M
UNIFORM SIZE 128k; #指定区尺寸为128k,如不指定,区尺寸默认为64k
二、建立UNDO表空间
CREATE UNDO TABLESPACE UNDOTBS02
DATAFILE ‘/oracle/oradata/db/UNDOTBS02.dbf‘ SIZE 50M
#注意:在OPEN状态下某些时刻只能用一个UNDO表空间,如果要用新建的表空间,必须切换到该表空间:
ALTER SYSTEM SET undo_tablespace=UNDOTBS02;
三、建立临时表空间
CREATE TEMPORARY TABLESPACE temp_data
TEMPFILE ‘/oracle/oradata/db/TEMP_DATA.dbf‘ SIZE 50M
四、改变表空间状态
1.使表空间脱机
ALTER TABLESPACE game OFFLINE;
如果是意外删除了数据文件,则必须带有RECOVER选项
ALTER TABLESPACE game OFFLINE FOR RECOVER;
2.使表空间联机
ALTER TABLESPACE game ONLINE;
3.使数据文件脱机
ALTER DATABASE DATAFILE 3 OFFLINE;
4.使数据文件联机
ALTER DATABASE DATAFILE 3 ONLINE;
5.使表空间只读
ALTER TABLESPACE game READ ONLY;
6.使表空间可读写
ALTER TABLESPACE game READ WRITE;
五、删除表空间
DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;
六、扩展表空间
首先查看表空间的名字和所属文件
select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;
1.增加数据文件
ALTER TABLESPACE game
ADD DATAFILE ‘/oracle/oradata/db/GAME02.dbf‘ SIZE 1000M;
2.手动增加数据文件尺寸
ALTER DATABASE DATAFILE ‘/oracle/oradata/db/GAME.dbf‘
RESIZE 4000M;
3.设定数据文件自动扩展
ALTER DATABASE DATAFILE ‘/oracle/oradata/db/GAME.dbf
AUTOEXTEND ON NEXT 100M
MAXSIZE 10000M;
设定后查看表空间信息
SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE
创建数据表:
Oracle中建表和指定表空间
--建一个表 create table HH2(
tid number primary key ,--主键设定
tname varchar2(20)
);
--删除表 drop table HH;
--表空间(相当于一个数据库)(DBA权限) create tablespace test datafile ‘D:test.dbf‘ size 10M autoextend on next 10M maxsize 100M
--指定表在那个表空间里面(默认在USERS表空间里) create table HH(tid number primary key) tablespace test; select * from tabs;
--删除 表空间 drop tablespace test including contents and datafiles --连带物理文件和表空间中的数据也一起删除
--建表建约束 create table student1(
sid number primary key,
sname varchar2(20) not null,
sage number,
ssex char(2),
saddress varchar2(100),
cid number references tclass(cid)--建立外键关系 );
create table tclass (
cid number primary key,
cname varchar2(20) );
--唯一unique 检查 check 默认值 modify 添加外键关系 添加列
alter table student1 add constraint UQ_student1_sname unique(sname);
alter table student1 add constraint CK_student1_agae check(sage between 19 and 70);
alter table student1 modify ssex default ‘男‘;
alter table student1 add constraint FK_student1_cid foreign key(cid) references tclass(cid);
alter table student1 add dt date;
--删除约束 alter table student1 drop constraint UQ_student1_sname ;