创建表空间和表(二)

创建表空间和表
ORACLE物理上是由磁盘上的以下几种文件:数据文件和控制文件和LOGFILE构成的。oracle中的表就是一张存储数据的表。表空间是逻辑上的划分。方便管理的。


数据表空间 (Tablespace)         


存放数据总是需要空间,Oracle把一个数据库按功能划分若干空间来保存数据。当然数据存放在磁盘最终是以文件形式,所以一盘一个数据表空间包含一个以上的物理文件
数据表         
在仓库,我们可能有多间房子,每个房子又有多个货架,每架又有多层。 我们在数据库中存放数据,最终是数据表的单元来存储与管理的。
数据文件         
以上几个概念都是逻辑上的, 而数据文件则是物理上的。就是说,数据文件是真正“看得着的东西”,它在磁盘上以一个真实的文件体现
1、创建表空间(tablespace):
格式: create tablespace 表空间名 datafile '数据文件名' size 表空间大小
                create tablespace data_test datafile 'e:\oracle\oradata\test\data_1.dbf' size 2000M;
                create tablespace idx_test datafile 'e:\oracle\oradata\test\idx_1.dbf' size 2000M;
                (*数据文件名 包含全路径, 表空间大小 2000M 表是 2000兆) 
2、建好tablespace, 就可以建用户了
          格式: create user 用户名 identified by 密码 default tablespace 表空间表;
                create user study identified by study default tablespace data_test;
                (*我们创建一个用户名为 study,密码为 study, 缺少表空间为 data_test -这是在第二步建好的.)
                (*缺省表空间表示 用户study今后的数据如果没有专门指出,其数据就保存在 data_test中, 也就是保存在对应的物理文件 e:\oracle\oradata\test\data_1.dbf中)

3、创建用户并指定表空间
CREATE USER cici IDENTIFIED BY cici PROFILE DEFAULT DEFAULT TABLESPACE CICI ACCOUNT UNLOCK;
create user jykl identified by jykl default tablespace jykl_data temporary tablespace jykl_temp;
授权给新用户
GRANT connect, resource TO cici;
grant create session to cici;
4. 授权给新用户
          grant connect,resource to study; 
          --表示把 connect,resource权限授予study用户
          grant dba to study;
          --表示把 dba权限授予给 study
5. 创建数据表           
      在上面,我们已建好了用户 study 我们现在进入该用户           
      sqlplusw study/study@test   然后就可以在用户study中创建数据表了           
      格式: create table 数据表名 


oracle命令建立主键外键

一、外键基本概念

1、MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。

2、外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接。

3、如果需要更好的性能,并且不需要完整性检查,可以选择使用MyISAM表类型,如果想要在MySQL中根据参照完整性来建立表并且希望在此基础上保持良好的性能,最好选择表结构为innoDB类型。

4、外键的使用条件

① 两个表必须是InnoDB表,MyISAM表暂时不支持外键

② 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;

③ 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

5、外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作
 


1、创建一张学生表
create table t_stu(  
  stuid      number(10)   primary key,  
  stuname    varchar2(20) not null,  
  stusex     varchar2(2)  default '男' check(stusex in('男','女'))
);  
   
 2、创建一张课程表
create table t_couse(  
  couseid     number(10)   primary key,  
  cousename   varchar2(20) not null,  
  cousetype   varchar2(4)
);  
 
3、创建一张学生课程成绩表(包括主外键)
create table t_score(  
  scoreid    number(10) primary key,  
  stuid      number(10) references t_stu(stuid),  
  couseid    number(10),  
  constraint fk_couseid foreign key(couseid)  
  references t_couse(couseid)  
  on delete cascade
); 


CREATE TABLE log(
log_id int(10)   unsigned NOT NULL auto_increment,
log_time         datetime NOT NULL,
log_user         varchar(30) NOT NULL,
log_title        varchar(30) default NULL,
log_content      text default NULL,
PRIMARY KEY(log_id));
orale表管理: 
Oracle创建表同SQL Server一样,使用CREATE TABLE命令来完成。创建约束则使用如下命令:
语法格式:alter table命令
alter table 表名 add constraint 约束名 约束内容。
不论创建表还是约束,与SQL Server基本相同,注:在Oracle中default是一个值,而SQL Server中default是一个约束,因此Oracle的default设置可以在建表的时候创建。
案例1:创建一个学生信息(INFOS)表和约束
 Oracle创建表和约束
 create table INFOS(
 STUID            varchar2(7) not null,               --学号 学号=‘S’+班号+2位序号
 STUNAME          varchar2(10) not null,              --姓名
 GENDER           varchar2(2) not null,               --性别 
 AGE              number(2) not null,                 --年龄
 SEAT             number(2) not null,                 --座号
 ENROLLDATE       date,                               --入学时间
 STUADDRESS       varchar2(50) default '地址不详',     --住址
 CLASSNO          varchar2(4) not null,               --班号 班号=学期序号+班级序号 
);

/  ①
alter table INFOS add constraint pk_INFOS primary key(STUID)  ②
/
alter table INFOS add constraint ck_INFOS_gender check(GENDER = '男' or GENDER = '女')  ③
/
alter table INFOS add constraint ck_INFOS_SEAT check(SEAT >=0 and SEAT <=50)  ④
/
alter table INFOS add constraint ck_INFOS_AGE check(AGE >=0 and AGE<=100)  ⑤
/
alter table INFOS add constraint ck_INFOS_CLASSNO check((CLASSNO >='1001' and CLASSNO<='1999') or
(CLASSNO >='2001' and CLASSNO<='2999'))  ⑥
/
alter table INFOS add constraint un_STUNAME unique(STUNAME)  ⑦
/
代码解析:
①  在Oracle代码中,“/”执行缓存区中的语句,由于缓冲区中只存储一条刚刚保存过语句,由于每条语句没有用分号结尾,只是保存在缓冲区,因此每条语句后面都有单独一行“/”。
②  创建一个主键约束。
③  与 ④ ⑤ ⑥ ⑦一起创建各种check约束。其中⑦是唯一约束,表示该列值是唯一的,列中的值不能重复。
 Oracle中创建外键约束与SQL Server相同。比如:现有成绩表定义如下:
 
案例2:创建一个成绩表(SCORES)表和约束
 Oracle创建表和约束
create table scores(
 ID                 number,                   --ID  ①
 TERM               varchar2(2),              --学期 S1或S2
 STUID              varchar2(7) not null,     --学号 
 EXAMNO             varchar2(7) not null,     --考号 E+班号+序号
 WRITTENSCORE       number(4,1) not null,     --笔试成绩
 LABSCORE           number(4,1) not null,     --机试成绩
);

ALTER TABLE SCORES ADD CONSTRAINT CK_SCORES_TERM CHECK(TERM = 'S1' OR TERM ='S2')
/
ALTER TABLE SCORES ADD CONSTRAINT FK_SCORES_INFOS_STUID FOREIGN KEY(STUID) REFERENCES INFOS(STUID)  ②
/
代码解析:
①  SQL Server中可以使用identify创建自动增长列,但是Oracle中的自动增长需要借助序列(Sequence)完成,在后面章节中讲解。
②  Oracle中的外键约束定义。
注意:表名,字段名要大写! 
 
oracle建表、建主键、外键基本语法
-创建表格语法:     
create table 表名(       
字段名1  字段类型(长度)   是否为空,        
字段名2  字段类型           是否为空 );

-增加主键     
alter table 表名 add constraint 主键名 primary key (字段名1);

-增加外键:     
alter table 表名 add constraint 外键名 foreign key (字段名1) references 关联表 (字段名2);

eg:增加外键

alter table B add constraint bfk foreign key (‘fk_column_name’) references A(‘column_name’) on delete no action on update no action;

eg:删除外键

alter table B drop foreign key bfk;

ON DELETE、ON UPDATE表示事件触发限制,可设参数:

① RESTRICT(限制外表中的外键改动,默认值)

② CASCADE(跟随外键改动)

③ SET NULL(设空值)

④ SET DEFAULT(设默认值)

⑤ NO ACTION(无动作,默认的)

在建立表格时就指定主键和外键
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 BASE_MAP  (
   BUREAU_CODE          NUMBER(3)                       not null,
   BASMAP_ID1           NUMBER(10)                      not null,
   NAME                 VARCHAR2(20)                    not null,
   VALID_TIME_START     DATE                            not null,
   VALID_TIME_END       DATE                            not null,
   SAVE_TIME            DATE                            not null,
   MEMO                 VARCHAR2(100),
   constraint PK_BASE_MAP primary key (BUREAU_CODE, BASMAP_ID1, BASMAP_ID2)
);



主键和外键一起建立:     
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));
 

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 这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间
例如:IS_SEND    NUMBER(1) default 1        --是否已发
创建表时可以给字段加上约束条件 例如: 非空 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)));

9. 通过子查询建表 通过子查询建表的例子 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,          --身份证号
);

创建/修改主键,唯一性约束和外键   这里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;
作为一种好习惯,不要把索引和表格的数据存在在同一个表空间中

猜你喜欢

转载自blog.csdn.net/qq_20853741/article/details/114138560