数据库约束和视图问题
--约束--******************************************************************************************--非空约束:(not null) * 确保字段值不允许为空 * 与其他约束相比是唯一只能在字段级定义 --在列级定义 create table EMPLOYEESNOTNULL ( EMPLOYEE_ID NUMBER(6), FIRST_NAME VARCHAR2(20) not null,--在列级定义 LAST_NAME VARCHAR2(25) ) --在表的外部定义约束 create table EMPLOYEESNOTNULL_01 ( EMPLOYEE_ID NUMBER(6), FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25) ) alter table EMPLOYEESNOTNULL_01 modify FIRST_NAME not null--******************************************************************************************--唯一性约束(UNIQUE) * 唯一性约束条件确保所在的字段或者字段组合不出现重复值 * 唯一性约束条件的字段允许出现(1或多个)空值 * Oracle将为唯一性约束条件创建对应的唯一性索引 注:如果字段有值,要唯一,但空值可以出现多个--方法一 在列级定义 create table emp_un_01 ( EMPLOYEE_ID NUMBER(6), FIRST_NAME VARCHAR2(20) unique, --列级定义 LAST_NAME VARCHAR2(25) ) --方法二 在表级定义约束 --在表级定义约束额语法格式 constraint 约束的名称 约束的类型(字段1,字段2) * 约束的名称 自定义 * 约束的类型(unique,primary key) * (字段1,字段2) 如果有多个字段,中间用,隔开 create table emp_un_02 ( EMPLOYEE_ID NUMBER(6), FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25), constraint un_emp_un_02 unique(first_name) --在表级定义约束 )--方法三 在表的外部定义约束 --语法结构: alter table table_name add constraint 约束的名称 约束的类型(字段1,字段2) * 约束的名称 自定义 * 约束的类型(unique,primary key) * (字段1,字段2) 如果有多个字段,中间用,隔开 create table emp_un_03 ( EMPLOYEE_ID NUMBER(6), FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25) ) alter table emp_un_03 add constraint un_emp_un_03 unique(first_name) --方法四(在表级定义联合唯一) create table emp_un_04 ( EMPLOYEE_ID NUMBER(6), FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25), constraint un_emp_un_04 unique(first_name,LAST_NAME) --在表级定义约束 ) --方法五(在表的外部定义) create table emp_un_05 ( EMPLOYEE_ID NUMBER(6), FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25) ) alter table emp_un_05 add constraint un_emp_un_05 unique(first_name,LAST_NAME)--******************************************************************************************--主键约束( PRIMARY KEY) * 主键从功能上看相当于非空且唯一 * 一个表中只允许一个主键 * 主键是表中能够唯一确定一个行数据的字段 * 主键字段可以是单字段或者是多字段的组合 * Oracle为主键创建对应的唯一性索引 --方法一 在列级定义 create table emp_pk_01 ( EMPLOYEE_ID NUMBER(6) primary key, FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25) ) --方法二 在表级定义 create table emp_pk_02 ( EMPLOYEE_ID NUMBER(6), FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25), constraint pk_emp_pk_02 primary key(EMPLOYEE_ID) )--方法三 在外部定义 create table emp_pk_03 ( EMPLOYEE_ID NUMBER(6), FIRST_NAME VARCHAR2(20), LAST_NAME VARCHAR2(25) ) alter table emp_pk_03 add constraint pk_emp_pk_03 primary key(EMPLOYEE_ID)--方法四(联合主键) 在表级定义--账号表create table account_01( accounid varchar2(18) primary key, --账号 balance number(10,2) --余额)--存款信息表create table inaccount_01( accounid varchar2(18), --账号 inbalance number(10,2), --存入金额 indate timestamp, --存款时间 constraint pk_inaccount_01 primary key(accounid,indate))insert into inaccount_01(accounid,inbalance,indate) values('1111',12,sysdate);insert into inaccount(accounid,inbalance,indate) values('1111',10,sysdate);--方法五 ,在外部定义create table account_02( accounid varchar2(18) primary key, --账号 balance number(10,2) --余额)--存款信息表create table inaccount_02( accounid varchar2(18), --账号 inbalance number(10,2), --存入金额 indate timestamp --存款时间)alter table inaccount_02add constraint pk_inaccount_02 primary key(accounid,indate)--******************************************************************************************--外键约束( FOREIGN KEY) * 外键是构建于一个表的两个字段或者两个表的两个字段之间的关系 * 外键确保了相关的两个字段的关系: * 子表外键列的值必须在主表参照列值的范围内,或者为空 * 主表主键值被子表参照时,主表记录不允许被删除 * 外键约束条件参照的是主表的一个或者多个字段的值,通常被外键参照的 是主表的主键或者唯一键 --在表级定义外键约束语法格式 constraint 约束的名称 foreign key(外键字段) references 表(主键) * 约束的名称 自定义 * 约束的类型(foreign key) * references 表(主键) 参照表的字段 一般为主表的主键--方法一 在表级定义create table deptfk_01( DEPARTMENT_ID NUMBER(4) primary key, DEPARTMENT_NAME VARCHAR2(30), MANAGER_ID NUMBER(6), LOCATION_ID NUMBER(4))create table EMPFK_01( EMPLOYEE_ID NUMBER(6) , FIRST_NAME VARCHAR2(20), DEPARTMENT_ID NUMBER(4), constraint fk_EMPFK_01 foreign key(DEPARTMENT_ID) references deptfk_01(DEPARTMENT_ID))--方法二 在表的外部定义--在外部定义外键约束的语法格式 alter table table_name add constraint 约束的名称 foreign key(外键字段) references 表(主键) * 约束的名称 自定义 * 约束的类型(foreign key) * references 表(主键) 参照表的字段 一般为主表的主键 create table deptfk_02( DEPARTMENT_ID NUMBER(4) primary key, DEPARTMENT_NAME VARCHAR2(30), MANAGER_ID NUMBER(6), LOCATION_ID NUMBER(4))create table EMPFK_02( EMPLOYEE_ID NUMBER(6) , FIRST_NAME VARCHAR2(20), DEPARTMENT_ID NUMBER(4))alter table EMPFK_02add constraint fk_EMPFK_02 foreign key(DEPARTMENT_ID) references deptfk_02(DEPARTMENT_ID)--方法三(主外键作用于一个表的两个字段)create table emp_two( EMPLOYEE_ID NUMBER(6) primary key, FIRST_NAME VARCHAR2(20), MANAGER_ID NUMBER(6) --外键)alter table emp_twoadd constraint fk_emp_two foreign key(MANAGER_ID) references emp_two(EMPLOYEE_ID)--******************************************************************************************--check约束 * Check约束条件是一种比较特殊的约束条件,通过check定义, * 强制定义在字段上的每一记录都要满足check中定义的条件。 * 在check中定义检查的条件表达式,进入表中的数据必须符合check中设置的条件 create table empck( EMPLOYEE_ID NUMBER(6) primary key, FIRST_NAME VARCHAR2(20), SALARY NUMBER(8,2) -->6000)alter table empckadd constraint ck_empck check(salary>6000)--******************************************************************************************--删除约束 * 删除约束条件对于表和数据不会产生影响 * 删除约束emp_manager_fk ALTER TABLE employees DROP CONSTRAINT emp_manager_fk; --删除ck_empck alter table empck drop constraint ck_empck--******************************************************************************************--约束的应用案例:create table F_ADDRESS( address_id number(6) primary key, province_name varchar2(20), city_name varchar2(20), district_name varchar2(20), street_name varchar2(20), street_nbr varchar2(20), detail varchar2(20), postcode varchar2(10))create table f_cust( cust_id number(6) primary key, cust_name varchar(50), address_id number(6), state varchar(10))alter table f_custadd constraint fk_f_cust foreign key(address_id) references F_ADDRESS(address_id)alter table f_custadd constraint ck_f_cust check(state in('在用','作废'))--定义约束f_cust中 cust_name唯一alter table f_custadd constraint un_f_cust unique(cust_name)--删除约束alter table f_custdrop constraint un_f_cust--******************************************************************************************************--视图: --为sql语句起的别名 给予表之上的一个查询语句--语法:--在CREATE VIEW语句后加入子查询. CREATE [OR REPLACE] VIEW view_name [(alias[, alias]...)] AS subquery [WITH READ ONLY]; create or replace view v_emp as select * from employees --查询视图 select * from v_emp; --视图的作用 --* select 语句比较复杂 --* select语句在开发的程序中可能多次使用 --* 在程序中直接使用视图 select * from v_emp create or replace view v_emp as select "EMPLOYEE_ID","FIRST_NAME","LAST_NAME","EMAIL","PHONE_NUMBER", "HIRE_DATE","JOB_ID","SALARY","COMMISSION_PCT","MANAGER_ID","DEPARTMENT_ID" from employees --描述视图的结构(命令行执行) desc v_emp describe v_emp --创建复杂视图 create or replace view v_emp_dept as select d.department_name,min(salary) mins,max(salary) mass,avg(salary) avgs,sum(salary) sums,count(salary) counts from employees e,departments d where e.department_id=d.department_id group by d.department_name --查询视图 select * from v_emp_dept --通过视图插入数据到表中 create or replace view v_dept as select deptno,dname,loc from dept --查询视图 select * from v_dept --通过 v_dept视图插入数据到dept表中 insert into v_dept(deptno,dname,loc) values(89,'xxx','ss') --通过设置WITH READ ONLY选项可以禁止对视图执行DML操作. create or replace view v_dept as select deptno,dname,loc from dept with read only --删除视图 --删掉视图不会导致数据的丢失,因为视图是基于数据库的表之上的一个查询定义. DROP VIEW view_name; --删除v_dept视图 drop view v_dept --******************************************************************************************************