Oracle DB使用DDL语句创建和管理表(四)

2014-11-24 15:16:01 · 作者: · 浏览: 2
中哪列有哪些约束,上面创建表的语句对应下面的约束。
hr@TEST0924> l
1 select a.owner,a.TABLE_NAME,b.COLUMN_NAME,a.CONSTRAINT_NAME,a.CONSTRAINT_TYPE,a.SEARCH_CONDITION
2 from USER_CONSTRAINTS a,USER_CONS_COLUMNS b
3* where a.CONSTRAINT_NAME=b.CONSTRAINT_NAME and A.table_name='EMPLOYEES'
hr@TEST0924> /
OWNER TABLE_NAME COLUMN_NAM CONSTRAINT_NAME C SEARCH_CONDITION
---------- ------------------------------ ---------- ------------------------------ - --------------------
HR EMPLOYEES SALARY EMP_SALARY_MIN C salary > 0
HR EMPLOYEES EMAIL EMP_EMAIL_UK U
HR EMPLOYEES EMPLOYEE_ID EMP_EMP_ID_PK P
HR EMPLOYEES DEPARTMENT_ID EMP_DEPT_FK R
HR EMPLOYEES JOB_ID EMP_JOB_FK R
HR EMPLOYEES MANAGER_ID EMP_MANAGER_FK R
HR EMPLOYEES LAST_NAME EMP_LAST_NAME_NN C "LAST_NAME" IS NOT NULL
HR EMPLOYEES EMAIL EMP_EMAIL_NN C "EMAIL" IS NOT NULL
HR EMPLOYEES HIRE_DATE EMP_HIRE_DATE_NN C "HIRE_DATE" IS NOT NULL
HR EMPLOYEES JOB_ID EMP_JOB_NN C "JOB_ID" IS NOT NULL
10 rows selected.
违反约束条件
当对列设置了约束条件后,如果试图违反约束条件规则,则会返回一条错误。例如,如果尝试更新一条记录,但该记录中的值受完整性约束条件所约束,则会返回一条错误。示例中,因为父表DEPARTMENTS中不存在部门55,所以你会收到违例ORA-02291“parent key not found(未找到父关键字)”。
hr@TEST0924> update employees set department_id=55 where department_id=110;
update employees set department_id=55 where department_id=110
*
ERROR at line 1:
ORA-02291: integrity constraint (HR.EMP_DEPT_FK) violated - parent key not found
如果某行中包含用作其它表中的外键的主键,则不能删除该行。
hr@TEST0924> delete from departments where department_id=60;
delete from departments where department_id=60
*
ERROR at line 1:
ORA-02292: integrity constraint (HR.EMP_DEPT_FK) violated - child record found
如果试图删除一条记录,但该记录中的值受完整性约束条件所约束,则会返回一条错误。
示例中试图从DEPARTMENTS表中删除部门60,但此操作导致一个错误,因为该部门编号已用作EMPLOYEES表中的外键。如果试图删除具有子记录的父记录,则会收到违例ORA-02292“child record found(存在子记录)”。
由于部门210 中没有任何雇员,因此下面的语句有效:
hr@TEST0924> delete from departments where department_id=210;
1 row deleted.
使用子查询创建表
通过组合CREATE TABLE语句和AS subquery选项
可以创建表并插入行。
CREATE TABLE table
[(column, column...)]
AS subquery;
使指定列的数量与子查询列的数量相匹配。
定义具有列名和默认值的列。
创建表的另一种方法是应用AS subquery子句,该方法既可以创建表,又可以将子查询返回的行插入表中。
在该语法中:
table 是表名称
column 是列的名称、默认值和完整性约束条件
subquery 是一条SELECT语句,用于定义要插入到新表中的一组行
准则
使用指定的列名创建一个表,然后将SELECT语句检索到的那些行插入到该表中。
列定义只能包含列名和默认值。
如果已经给出列的规格,则列数必须等于子查询SELECT列表中的列数。
如果没有给出列的规格,则表的列名与子查询中的列名相同。
列数据类型定义和NOT NULL约束条件会传递到新表中,请注意,只会继承显式NOT NULL约束条件。PRIMARY KEY列不会将NOT NULL特性传递给新列。任何其它约束条件规则也不会传递到新表中。但是,你可以在列定义中添加约束条件。
使用子查询创建表
CREATE TABLE dept80
AS
SELECT employee_id, last_name,salary*12 ANNSAL,hire_date FROM employees WHERE department_id = 80;
DESCRIBE dept80
示例中创建了一个名为DEPT80的表,该表包含在部