日期:2014-05-16  浏览次数:20487 次

数据库约束和视图问题
--约束
--******************************************************************************************
--非空约束:(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_02
add constraint pk_inaccount_02 primary key(accounid,indate)
--******************************************************************************************
--外键约束( FOREIGN KEY)
 * 外键是构建于一个表的两个字段或者两个表的两个字段之间的关系
 * 外键确保了相关的两个字段的关系:
 * 子表外键列的值必须在主表参照列值的范围内,或者为空
 * 主表主键值被子