第六章数据库的主要对象本章要点•管理表•数据字典表•完整性约束条件的使用•管理索引•管理视图•同义词的使用数据库的对象对象名称描述表基本的数据存储对象,以行和列的形式存在,列也就是字段,行也就是记录数据字典也就是系统表,存放数据库相关信息的表约束条件执行数据校验,保证了数据完整性的视图一个或者多个表数据的逻辑显示索引用于提高查询的性能同义词对象的别名数据库对象的命名规则–必须以字母开头–可包括数字和三个特殊字符(#_$)–不要使用oracle的保留字–同一用户下的对象不能同名建表的语句为了创建表,你必须具有:•创建表的权限•足够的存储区域标准的建表语法:CREATETABLE[schema.]table(columndatatype[DEFAULTexpr],…);数据类型数据类型说明VARCHAR2(size)可变长字符串CHAR(size)定长字符串NUMBER(p,s)数字值DATE日期值LONG变长度的字符串,最大字节数可达2GBCLOB单位字符串数据最大字节数4GRAWandLONGRAW存储二进制数据的变长度字符串BLOB二进制数据,最大字节数4GBFILE二进制数据外部存储,最大字节数4G使用子查询创建表•使用子查询创建表的语法–CREATETABLEtable–[column(,column...)]–ASsubquery;•新表的字段列表必须与子查询中的字段列表匹配•字段列表可以省略ALTERTABLE语句•使用ALTERTABLE语句可以:–增加字段–修改字段–删除字段ALTERTABLEtableADD(columndatatype[DEFAULTexpr][,columndatatype]...);ALTERTABLEtableMODIFY(columndatatype[DEFAULTexpr][,columndatatype]...);ALTERTABLEtableDROP(columns);在表中增加字段•使用ADD子句增加字段,新的字段只能被加到整个表的最后ALTERTABLEemployeesADD(sexCHAR(1));修改字段•可修改列的数据类型,大小和默认值ALTERTABLEemployeesMODIFY(sexnumber(1));•不是任何情况都可以修改的,当字段只包含空值时,类型、大小都可以修改,否则修改可能不能成功删除字段•可以从表中删除列:ALTERTABLEemployeesDROPCOLUMNsex;•从每行中删除掉字段占据的长度和数据,释放在数据块中占用的空间.•删除大表中的字段将需要比较长的时间.删除表的内容–TRUNCATETABLE语句•清除表中所有的记录•是DDL语句,不可以回滚•释放表的存储空间–是删除数据的方法之一–TRUNCATETABLEtable_name;删除表•表中所有数据将被删除•没有完成的事务被提交•所有相关的索引被删除•不能回退DROPTABLEtable_name;改变对象名称•使用RENAME语句改变对象名称,可以修改表、视图、序列或者同义词的名称–RENAMEold_nameTOnew_name;•必须是对象的所有者在Oracle数据库中的表•用户表:–被用户创建和维护的一些表–包括了用户自己的信息•数据字典表:–被Oracle数据库创建和维护的一些表–包括了数据库的信息数据字典•是每个Oracle数据库的核心•用于描述数据库和它的所有对象•包括了只读的表和视图•被SYS用户拥有•被Oracleserver维护•用户可以使用SELECT访问数据字典的内容•数据字典提供了下列信息:–数据库的物理和逻辑结构–对象的定义和空间分配–完整性约束条件–用户–角色–权限–审计数据字典分类•主要有三种字典视图:–DBA:所有方案包含的对象信息–ALL:用户可以访问的对象信息–USER:用户方案的对象信息数据字典的例子–通用信息:–DICTIONARY–对象信息:–DBA_TABLES,DBA_INDEXES,DBA_TAB_COLUMNS,DBA_CONSTRAINTS–空间分配信息:–DBA_SEGMENTS,DBA_EXTENTS–数据库结构:–DBA_TABLESPACES,DBA_DATA_FILES查询数据字典•察看被用户用有的表SELECTtable_nameFROMuser_tables;•察看用户拥有的所有对象类型SELECTDISTINCTobject_typeFROMuser_objects;•察看所有用户拥有的表SELECT*FROMdba_tables;什么是约束•约束是在表上强制执行的数据校验规则.•当表中数据有相互依赖性时,可以保护相关的数据不被删除.•Oracle支持下面五类完整性约束:–NOTNULL非空–UNIQUEKey唯一键–PRIMARYKEY主键–FOREIGNKEY外键–CHECK检察约束概述•Oracle使用SYS_Cn格式命名约束,也可以由用户命名•创建约束的时机–在建表的同时创建–建表后创建•可定义列级或表级约束•有单列约束和多列约束创建表时创建约束CREATETABLE[schema.]table(columndatatype[DEFAULTexpr][column_constraint],…[table_constraint]);CREATETABLEemp((emp_idNUMBER(3),nameVARCHAR2(16),…dept_idNUMBER(4)NOTNULL,CONSTRAINTemp_empid_pkPRIMARYKEY(emp_id));非空约束(NOTNULL)•确保字段值不允许为空•只能在字段级定义非空约束(NOTNULL)CREATETABLEemployees(employee_idNUMBER(6),last_nameVARCHAR2(25)NOTNULL,salaryNUMBER(8,2),commission_pctNUMBER(2,2),hire_dateDATECONSTRAINTemp_hire_date_nnNOTNULL,…)唯一性约束(UNIQUE)•唯一性约束条件确保所在的字段或者字段组合不出现重复值•唯一性约束条件的字段允许出现空值•Oracle将为唯一性约束条件创建对应的唯一性索引唯一性约束(UNIQUE)CREATETABLEemployees(employee_idNUMBER(6),last_nameVARCHAR2(25)NOTNULL,emailVARCHAR2(25),salaryNUMBER(8,2),commission_pctNUMBER(2,2),hire_dateDATENOTNULL,...CONSTRAINTemp_email_ukUNIQUE(email));主键约束(PRIMARYKEY)•主键从功能上看相当于非空且唯一•一个表中只允许一个主键•主键是表中能够唯一确定一个行数据的字段•主键字段可以是单字段或者是多字段的组合•Oracle为主键创建对应的唯一性索引主键约束(PRIMARYKEY)CREATETABLEdepartments(department_idNUMBER(4),department_nameVARCHAR2(30)CONSTRAINTdept_name_nnNOTNULL,manager_idNUMBER(6),location_idNUMBER(4),CONSTRAINTdept_id_pkPRIMARYKEY(department_id));外键约束(FOREIGNKEY)•外键是构建于一个表的两个字段或者两个表的两个字段之间的关系•外键确保了相关的两个字段的两个关系:•子表外键列的值必须在主表参照列值的范围内,或者为空•主表外键值被子表参照时,主表记录不允许被删除•外键参照的是主表的主键或者唯一键CREATETABLEemployees(employee_idNUMBER(6),last_nameVARCHAR2(25)NOTNULL,emailVARCHAR2(25),salaryNUMBER(8,2),commission_pctNUMBER(2,2),hire_dateDATENOTNULL,...department_idNUMBER(4),CONSTRAINTemp_dept_fkFOREIGNKEY(department_id)REFERENCESdepartments(department_id),CONSTRAINTemp_email_ukUNIQUE(email));外键约束(FOREIGNKEY)CHECK约束•定义在字段上的每一记录都要满足的条件•在check中定义检查的条件表达式,数据需要符合设置的条件•条件表达式不允许使用:–SYSDATE,UID,USER,USERENV等函数–参照其他记录的值...,salaryNUMBER(2)CONSTRAINTemp_salary_minCHECK(salary0),...增加约束•可增加或删除约束,但不能直接修改•可使约束启用和禁用•非空约束必须使用MODIFY子句增加ALTERTABLEtableADD[CONSTRAINTconstraint]type(column);加约束•加FOREIGNKEY约束到EMP表ALTERTABLEemployeesADDCONSTRAINTemp_manager_fkFOREIGNKEY(manager_id)REFERENCESemployees(employee_id);删除约束•删除约束emp_manager_fkALTERTABLEemployeesDROPCONSTRAINTemp_manager_fk;•删除主键约束和相关的外键约束ALTERTABLEdepartmentsDROPPRIMARYKEYCASCADE;