oracle查看表的外键 10g 不能建外键

查看: 7808|回复: 11
oracle创建主、外键约束报错
论坛徽章:16
OS: rhel linux as4& &
DB: oracle10g r2
从oracle在线文档上搜到创建主、外键的语句如下:
ALTER TABLE Dept_tab ADD CONSTRAINT Dept_pkey PRIMARY KEY (deptno);
ALTER TABLE Emp_tab&&ADD CONSTRAINT Dept_fkey FOREIGN KEY (Deptno) REFERENCES Dept_
于是作了如下实验:
1:添加主键:
SQL& alter table emp add constraint pk-emp primary key (empno);
alter table emp add constraint pk-emp primary key (empno)
& && && && && && && && && && && &*
ERROR at line 1:
ORA-00904: : invalid identifier
SQL& alter table emp add constraint emp_pkey primary key(empno);
Table altered.
SQL& alter table emp add constraint xx_pkey primary key(empno);
Table altered.
2:添加外键
SQL& alter table emp add constraint dept_fkey foreign key(deptno)
Table altered.
SQL& alter table emp add constraint dept-fkey foreign key (deptno)
alter table emp add constraint dept-fkey foreign key (deptno) references dept
& && && && && && && && && && && &&&*
ERROR at line 1:
ORA-00904: : invalid identifier
SQL& alter table emp add constraint xx_fkey foreign key (deptno)
Table altered.
从实验中得出结论,不管是添加主键,还是添加外键,都必须使用特定的格式&&_pkey&&或&&_fkey
是这样的么 ?&&前辈们可否再指点一下!
注意蓝色部分!
论坛徽章:51
回复 #1 sxitsxit 的帖子
按照你测试的结果 应该是不能用-
而不是只能用_吧。
论坛徽章:16
我又使了几把,发现还真的必须带 下划线
如果不带下划线,那么就报错
SQL&&&alter table emp add constraint xx_key foreign key (deptno)
Table altered.
SQL& alter table emp add constraint xx_xx1 foreign key (deptno)
Table altered.
SQL& alter table emp add constraint cc_45 foreign key (deptno)
Table altered.
论坛徽章:16
应该是这样的吧&&前辈们
论坛徽章:12
原帖由 sxitsxit 于
15:58 发表
我又使了几把,发现还真的必须带 下划线
如果不带下划线,那么就报错
SQL&&&alter table emp add constraint xx_key foreign key (deptno)
Table altered.
SQL& alter table emp add constraint xx_xx1 foreign key (deptno)
Table altered.
SQL& alter table emp add constraint cc_45 foreign key (deptno)
Table altered.
不是必须要下划线,而是你的‘-’这个符号是不允许的!
论坛徽章:16
哦&&等下 我再测试看看 !
论坛徽章:16
刚有测试了一把
SQL& alter table dept add constraint xxx primary key (deptno);
Table altered.
SQL& alter table dept add constraint xx*ss primary key (deptno);
alter table dept add constraint xx*ss primary key (deptno)
& && && && && && && && && && && & *
ERROR at line 1:
ORA-00904: : invalid identifier
SQL& alter table dept add constraint sxit.df primary key (deptno);
alter table dept add constraint sxit.df primary key (deptno)
& && && && && && && && && && && && &*
ERROR at line 1:
ORA-00904: : invalid identifier
确实,除了一些特定的字符以外,是可以任意添加 主、外键的!&&
论坛徽章:1088
当然,文档很清楚,标识符很多特殊符号都不允许的,当然你加双引号应该就可以了
为什么不看看文档找错误原因呢,写这么多也浪费时间不是...
论坛徽章:16
就是没在文档中找到错误的原因&&所以才测试的
论坛徽章:1088
文档有啊,第2章,Schema Object Names and Qualifiers
加双引号就不用遵守规则,但是不建议使用
itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号:10 广播电视节目制作经营许可证:编号(京)字第1149号oracle命令建立主键外键
oracle命令建立主键外键
1、创建一张学生表
SQL& create table t_stu( &
& 2 &stuid number(10) primary key, &
& 3 &stuname varchar2(20) not null, &
& 4 &stusex varchar2(2) default '男' check(stusex in('男','女'))); &
Table created &
Executed in 0.547 seconds &
2、创建一张课程表
SQL& create table t_couse( &
& 2 &couseid number(10) primary key, &
& 3 &cousename varchar2(20) not null, &
& 4 &cousetype varchar2(4)); &
& www.2cto.com &
Table created &
Executed in 0.062 seconds &
3、创建一张学生课程成绩表(包括主外键)
SQL& create table t_score( &
& 2 &scoreid number(10) primary key, &
& 3 &stuid number(10) references t_stu(stuid), &
& 4 &couseid number(10), &
& 5 &constraint fk_couseid foreign key(couseid) &
& 6 &references t_couse(couseid) &
& 7 &on delete cascade); &
Table created &oraclexe怎么手动建外键_百度知道
oraclexe怎么手动建外键
我有更好的答案
Program Files下的Oracle目录 61、执行Oracle U目录,以及C:&#92,卸载Oracle产品 2、删除regedit下的所有Oracle相关项 3、重启机器 4、sc delete 删除Oracle的相关服务 5、手动删除&Oracle_Home&gt、删除手动添加的环境变量 注:必须要删除自己添加的环境变量,我就因为开始没有删除ORACLE_HOME,导致一直出错
采纳率:66%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。博客分类:
作者:赵磊
博客:http://elf8848.iteye.com
本文章通过oracle 10g 11g自带的HR用户下的7张表,来学习SQL基础知识。 在安装数据库时,勾选相应的选项,就会安装HR用户下练习使用的7张表。 如果你的oracle数据库没有HR用户,可以下载本文附件中的工具包来安装。
官方联机文档下载地址,400多M吧。
--------------------------------------基本准备-------------------------------------------------------使用sqlplus连接数据库: 1 本地主机连接远端的oracle数据库,本地主机要安装oracle客户端,输入如下命令 sqlplus 用户名/密码@网络服务名 网络服务名是什么?其实就是本地主机安装oracle客户端时配置远端数据库的别名,在Oracle Net Manager中叫“网络服务名”, 在sqlplusw中叫“主机字符串”。
2 本地主机连接远端的oracle数据库成功后,切换到其实用户 SQL& conn scott/tigger@网络服务名
sys/sys的密码@网络服务名 as sysdba3 连接本机的oracle数据库,输入如下命令 sqlplus /nolog
conn / as sysdba 4 连接本机的oracle数据库成功后,切换到其实用户 SQL& conn scott/ 常用SQL/PLUS命令 查看一行显示字符数:SQL&
(简写:show lines) 设置显示宽度为200字符:SQL& set linesize 200; (简写:set lines 200) 查看目前的pagesize,默认是14: 将pagesize设置好100:set pagesize 100;
常用PL/SQL命令
查看表的结构(详细): select dbms_metadata.get_ddl('TABLE','大写表名') FROM查看表的结构(简单): desc 表名查看当前数据库登录操作的用户 :show user
常 用字典、包查看数据库有哪些用户从“用户字典”(注意权限):select username,account_status from dba_ 查看当前用户有哪些表:select table_name from user_
查看当前用户的对象:select object_name,object_type from user_
解锁scott帐户
alter user
//解锁帐户 grant connect,resource,unlimited //分配权限 alter user scott
//设置密码 Oracle sqlplus的清屏
如果是通过本身的sqlplus那么方法有: 同时按SHIFT和DELETE键然后点OK、clear screen ;或 clea scre;实现 如果是通过cmd模式进入的话: 可以通过host cls命令来实现清屏 ----------------------------------------------------Schema------------------------------------------------- HR用户下的7张表 Schema 表的说明:
employees 员工表
departments 部门表(员工所在的部门)
地址表(部门在哪个地址)
countries 国家表(地址在哪个国家)
大区表(亚太区,北美区)
(国家在哪个大区)
工作岗位表 (员工的工作岗位)
jbo_history
工作变动历史表
----------------------------运算符部分------------------------------
=,&,&,&=,&=,&&,
between ...
(两端包含)
in() , not in()
like '%磊_'
, %配置多个字符
, _ 配置一个字符。
like '%磊\_' escape '\'
,说明\是转义字符,可以查询结果中包含_。
逻辑运算符:and , or , not
----------------------------子句部分------------------------------
select子句
order by 子句, 结果有null值时,升序时null放在结果的最后面,降序null值放在结果的最前面。可以修改:order by id desc nulls last/
group by 子句
having 子句
for update子句
---------------------------函数部分-------------------------------
字符函数:
UPPER('String') 转换成大写字母
LOWER('String') 转换成小写字母
INITCAP('String')转换为首字母大写,其它小字
SUBSTR('HelloWorld',1,5)
结果是:Hello。参数说明:('HelloWorld',1,5)意思是截取'HelloWorld'串从第1个开始,取5个。SQL中“第一”是从1开始的。
INSTR('HelloWorld','W')
replace('JACK and JUE','J','BL') 替换,把'J' 替换成'BL'。
trim() 去空格
数学函数:
ROUND(45.926,2)
结果:45.93
保留两位小数,四舍五入。
ROUND(45.926,-1)
TRUNC(45.926,2)
结果:45.92
保留两位小数,多余部分直接截去,无四舍五入。
TRUNC(45.926,-1)
日期函数:
SQL& select sysdate
结果是:23-7月 -10
sysdate是一个无参数的函数。
转换函数:
(隐式转换,显示转换)
---- 日期转字符
SQL& select to_char(sysdate,'YYYY-MM-DD') as date_
SQL& select to_char(sysdate,'fmYYYY-MM-DD') as date_
fm作用:去掉前导0,07月显示为7月。
SQL& select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') as date_
结果: 12:06:19
---- 数字转字符
select to_char(100,'L99,999.00')
结果:¥100.00
以本地货币格式化成字符串。
---- 字符转成数值
TO_NUMBER('100')
---- 字符转成日期
TO_DATE('','YYYY-MM-DD')
null相关函数:
相当于if else
NVL(name,0)
如果name值是null,就返回0,否则返回name。
NVL2( name,1 ,0 )
如果name值是null,就返回0,否则返回1。
NULLIF(1,1)
如果两个参数相等,就返回null,否则返回第一个参数。
COALESCE(name,age,pwd) 可跟多个参数,参数中从前向后,返回第一个不为null的参数。
聚合(组)函数:
VARIANCE()
----------------------------select部分------------------------------
去除重复的值, 例select distinct department_id,job_
distinct 关键字后跟多个列时,列的组合总体要维一。
查看表的结构,
DESCRIBE ,他是sql plus的命令,可以简写为DESC,后面可以不写分号。 例DESC employees
子查询可以出现在where,having,from 子句中。子查询中的语句要使用() 括起来。
当子查询返回结果为null时,整个SQL使用了非 "is null"运算符时,查询结果就是0条记录。
not in ( 集合[111,222,null])时,整个SQL查询结果就是0条记录。
子查询 -- 在where子句中:
= , & , & , &&是单行运算符,使用单行运算时,子查询只能返回一条结果(一行一列)。
in ,not in ,any,all ,聚合函数,
是多行运算符,使用多行运算符时,子查询可以返回多条结果(多行一列)。
子查询只返一条结果,并使用了单行运算符,SQL语句可以正常执行
select last_name ,salary from employees where salary & (select salary from employees where last_name ='Abel');
子查询只返多条结果,并使用了单行运算符,SQL语句不可以正常执行
select last_name ,salary from employees where salary & (select salary from employees where last_name like 'K%');
第 1 行出现错误:
ORA-01427: 单行子查询返回多个行
子查询 -- 在having子句中:
SELECT department_id ,MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary)
(SELECT MIN(salary)
FROM employees
WHERE department_id=50);
子查询 -- 在from子句中:
--------------------select多张表
join部分-------------------------
内外连接说明表
连接字段为null值或不能实现“拉手”连接的行,
不会出现在连接结果集合中
连接字段为null值或不能实现“拉手”连接的行,
会现在连接结果集合中
Inner Joins 内连接
Self join 自己连接自己
Nonequijoins 不等连接
left outer join 左外连接
right outer join 右外连接
full outer join 全连接
Inner Joins 内连接
(是内连接,连接字段为null值或不能实现“拉手”连接的行,不会出现在连接结果集合中)
--使用join on 方式(SQL标准),实现表的内连接:(经常用)
两张表中可连接的字段名称不相同
select employee_id,last_name,location_id,e.department_id
from employees e join departments d on e.department_id=d.department_
e.department_id
字段两个表都有,要加前缀或表别名。
三张表以上时使用: t1 join t2
on t1.n=t2.n join t3 on t3.n=t2.n
--Natural join 自然连接(SQL标准),实现表的内连接: (很少用)
两张表中可连接的字段名称相同,类型相同 就可以使用这种简写的连接方法,
在departments表与locations表中都有location_id字段且类型相同。
如果两张表中各有两个字段符合上述要求,就用这两个字段一起做join。
SELECT department_id,department_name,location_id,city
FROM departments
NATURAL JOIN
自然连接(SQL标准),实现表的内连接:(很少用)
两张表中可连接的字段名称相同,就可以进行连接,类型不相同oracle可以自动转换
如果两张表中各有两个字段符合上述要求,但使用的是哪一个字段来连接呢,
我们可以通过using来指定,using与natural join 不可同时出现。
select employee_id,last_name,location_id,department_id
from employees join departments
using(department_id);
department_id
字段两个表都有,但不要加前缀或表别名
--使用Oracle专有的语法,实现表的内连接:(经常用)
SELECT table1.column,table2.column
FROM table1,table2
WHERE table1.column=table2.column ;
可以按多个字段来连接表
SELECT employee_id,last_name,department_name
FROM employees e,departments d
WHERE e.department_id=d.department_id AND e.manager_id=d.manager_id;
三张表连接
SELECT employee_id,city,department_name
FROM employees e,departments d,locations l
WHERE e.department_id=d.department_id AND d.location_id = l.location_id;
Self join 自己连接自己
(是内连接,连接字段为null值或不能实现“拉手”连接的行,不会出现在连接结果集合中)
同一张表起两个不同的别名,实现连接自己
下面是SQL标准的语法:
SELECT w.last_name emp,m.last_name mgr
FROM employees w JOIN employees m
ON w.manager_id=m.employee_
下面是Oracle的语法:
SELECT w.last_name emp,m.last_name mgr
FROM employees w,employees m
WHERE w.manager_id = m.employee_
Nonequijoins 不等连接
(是内连接,连接字段为null值或不能实现“拉手”连接的行,不会出现在连接结果集合中)
连接的条件不是“等于”,是在一个范围内。
t1员工表, t2是工资档次表 , 求员工的工资在哪个档次之间。
t1 join t2 on
t1.工资 between t2.本档最低工资
t2.本档最高工资
Outer jion 外连接
(是外连接,连接字段为null值或不能实现“拉手”连接的行,会现在连接结果集合中)
--left outer join 左外连接
SQL标准语法:
SELECT e.last_name,d.department_name
FROM employees e LEFT OUTER JOIN departments d
ON e.department_id = d.department_
Oracle语法: 在右边表加一个(+)
SELECT e.last_name,d.department_name
FROM employees e ,departments d
WHERE e.department_id = d.department_id(+);
--right outer join 右外连接
SQL标准语法:
SELECT e.last_name,d.department_name
FROM employees e RIGHT OUTER JOIN departments d
ON e.department_id = d.department_
Oracle语法:在左边表加一个(+)
SELECT e.last_name,d.department_name
FROM employees e ,departments d
WHERE e.department_id(+) = d.department_
--full outer join 全连接
SQL标准语法:
SELECT e.last_name,d.department_name
FROM employees e FULL OUTER JOIN departments d
ON e.department_id = d.department_
Oracle语法:
Cartesian product
--Corss join
第一张表有n条记录,第二张表有m条记录, 连接后会生成 n*m条记录的表。
当连接表时, 条件失效,会把所有的可能连接都连接一次,就会形成n*m条记录的新表。
我们应避免笛卡儿积,只有想生成大量测试数据来填充表进才使用
SQL标准语法:
SELECT last_name,department_name
FROM employees
CROSS JOIN
Oracle语法:
就是不要where条件。
---------------------------insert部分-------------------------------
插入一条:
INSERT INTO departments (department_id,department_name,manager_id,location_id)
VALUES ( 71,'Public Relaations',100,1700);
批量插入:
INSERT INTO 表名 字段(一致)
字段(一致)
INSERT INTO copy_departments
SELECT * FROM
由于两个表的 字段的数据类型,字段的顺序都一样,所以省略了字段名。
---------------------------update部分-------------------------------
UPDATE 表名 SET
列=值,列=值
UPDATE 表名 SET
列=(子查询),列=(子查询)
条件=(子查询)
---------------------------detete部分-------------------------------
DELETE [FROM] 表名 WHERE 条件
DELETE [FROM] 表名 WHERE 条件=(子查询)---------------------------- 管理表-----------------------------------
CREATE TABLE copy_departments AS SELECT * FROM
TRUNCATE TABLE copy_
与delete的不同是,TRUNCATE 不可以容易的回滚。
CREATE TABLE [schema.]表名 ( column 数据类型 [default expr ]);
CREATE TABLE t3
dname varchar2(14),
age number(5),
hire_date DATE DEFAULT SYSDATE);
查看表结构:
是否为空? 类型
----------------------------------------- -------- ----------------------------
NUMBER(38)
VARCHAR2(14)
创建两表有主外键关系的表:
表1:book表,字段有id(主键),name (书名);
表2:bookEnrol表(图书借出归还登记),字段有id,bookId(外键),dependDate(变更时间),state(1.借出 2.归还)。
create table book(
name varchar2(30),
PRIMARY KEY (id)
create table book2(
id number PRIMARY KEY,
name varchar2(30))
create table bookEnrol(
bookId int,
dependDate date,
state int,
FOREIGN KEY (bookId) REFERENCES book(id) ON DELETE CASCADE
用子查询创建表:
语法:CREATE TABLE tablename [(新列名,新列名...)]
新列名可以省略,新列名的数量要与 子查询的列数量一列。
如果子查询某列是表达式无列名,要起别名。
原表的约束,只有not null约束会传递给新表,其它约束丢失不传递。
CREATE TABLE t8 as select *
创建了一个t8表,与employees一样, employees原有的约束只有not null约束会传递给t8表,其实约束丢失不传递。
CREATE TABLE t7 (new_id,new_name) as select employee_id,last_
创建了t7表,有new_id,new_name两个字段,数据来源于employees的employee_id,last_name 两个字段
CREATE TABLE t9 AS
SELECT employee_id,last_name,
salary*12 ANNSAL,
//表达式无列名,同时又没有指定新列名,这时要起别名。
或者在AS前指定新列名。
FROM employees
department_id=80;
DROP TABLE table_
DROP TABLE table_name PURGE; 被删除表不进回收站,直接删除。(10G新加的功能)
ALTER TABLE
略。。。---------------------------- 事务-----------------------------------------------
事务什么时候会开始与结束--事务的边界:
1 开始执行一条DML语句时,比如insert,会自动开启一个新事务。
2 当COMMIT 或 ROLLBACK 时,事务会结束。
3 当开始一个DDL 或 DCL 语句时,前面的事务会提交,因为DDL ,DCL语句要在一个单独的事务中执行。
4 用户正常退出SQLplus时会提交事务。
5 当ORACLE系统死掉挂掉,再重新启动后,会回滚之前没有提交的事务。
SAVEPOINT a
定义保存点a
ROLLBACK TO
回滚到保存点a
---------------------------- 常用的数据库对象---------------------------------
查看用户对象
SELECT object_name,object_type FROM user_
-------------------------------命名规则----------------------------------------
1 必须以字母开头
2 最大长度为30
3 A-Z,a-z,0-9,_,$,#
4 不能包含Oracle保留关键字
-------------------------------数据类型----------------------------------------
VARCHAR2(size)
VARCHAR2(200 CHAR)
CHAR(size)
NUMBER(p,s)
BFILE一个大文件保存在操作系统上,Oracle保存一个指针
FOWID每个表都有一列叫rowid
---------------------------------常用的约束-----------------------------------
PRIMARY KEY
FOREIGN KEY
创建表时在字段后添加主键约束:
CREATE TABLE t5 ( emp_id number(4) PRIMARY KEY , dname varchar2(14) NOT NULL, age number(5)
NOT NULL, hire_date DATE DEFAULT SYSDATE);
修改约束:
primary key的语法:alert table table_name add constraint key_name primary key(columns);
unique key的语法:alert table table_name add contraint key_name unique(columns);
删除约束:
ALTER TABLE table_name DROP PRIMARY KEY
--------------------------------------------------视图 View------------------------------------------------------------
创建视图的语法:
UPDATE视图:
视图通常是用来读的,不过也可以有条件的UPDATE视图中的记录,
比如经过avg()一类的聚合函数计算出来的平均值就不能修改,
group by 分组出来的数据就不能修改,DISTINCT过滤后的数据,ROWNUM列做为视图中的一列时,表达式计算出来的结果,都不能修改
而与基表一一对应的项目就可以修改。
修改时使用UPDATE语句,与修改一般表一样的。
ALTER VIEW :
略,请查询联机文档
删除视图:
DROP VIEW view_
--------------------------------------------------序列
Sequence-----------------------------------------------------
创建序列:
CREATE SEQUENCE squence_
删除序列:
DROP SEQUENCE squence_
查出序列值 - 下一个值 ,取出后,原值加1:
SELECT squence_name.NEXTVAL FROM
查出序列值 - 当前值,取出后,原值不变:
SELECT squence_name.CURRVAL FROM
使用序列:
INSERT INTO 表 (主键字段,其它字段... ) VALUES (squence_name.NEXTVAL , 其它值...);
--------------------------------------------------索引
Index----------------------------------------------------------
CREATE [UNIQUE] [BITMAP] INDEX index_name
ON 表名(列名 [,列名]... );
创建索引:
CREATE INDEX emp_last_name_idx ON employees(last_name);
删除索引:
DROP INDEX index_
--------------------------------------------------同义词 Synonym----------------------------------------------------
同义词就是为一个对象起一个别名。
CREATE [PUBLIC] SYNONYM synonym_name FOR
不加PUBLIC,这个同义词就保存在当前用户的对象,加了PUBLIC,这个同义词就不只是当前用户的,其它用户也可以使用。
创建同义词:
CREATE SYNONYM d_sum
数据库对象;
删除同义词:
DROP SYNONYM
d_sum(同义词的名称)
下载次数: 29
浏览: 5860589 次
来自: 北京
谢谢,学到很多
非常感谢非常感谢
推荐用StratoIO打印控件,功能如下:1、Html友好的打 ...
heipacker 写道这篇是抄的?不知道
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Posts - 225,
Articles - 1,
Comments - 2463
18:25 by chenkai, ... 阅读,
A:Check约束
&1&--创建表&2&create&table&order_status&3&(&4&&&id&integer&constraint&order_status_pk&primary&key&,&5&&&status&varchar(120)&,&6&&&last_modified&date&default&sysdate&7&);&8&--添加Check约束&9&alter&table&order_status&<span style="color: #&add&constraint&order_status_ck&check&(status&in('BeiJing','ShangHai','TaiWan'));<span style="color: #&<span style="color: #&alter&table&order_status<span style="color: #&add&constraint&order_status_id_ck&check(id&10);<span style="color: #&--测试数据<span style="color: #&insert&into&order_status(id,status)<span style="color: #&values(132,'ShangHai');
(1)在创建Check约束时,表中所有的行必须满足添加约束条件, 如果在添加约束已经存在数据 条件不满足会提示一个ORA-02293错误:截图如下:
一般处理在添加约束前最好清空原表中数据,上面提示错误有一个例外:在添加约束将其禁用. 这就涉及到"启用约束"和"禁用约束"操作.后面详解.还可以指定Enable Novalidate选项.从而使约束只适用于新添加数据.而不必管约束添加前数据.在插入数据时如果数据不符Check约束会提示一个ORA-02290错误.修改插入数据即可.
B:Not Null约束
&--添加上述创建表&not&null约束&alter&table&order_status&modify&status&constraint&&order_status_newref&not&null;&&alert&table&order_status&modify&last_modified&not&null;&&格式:注意使用Modify&而非以前使用的Add&Constraint&格式如下:&alert&table&[表名]&modify&[表中列名]&constraint&[约束唯一标示]&not&
A1:在为Last_modified添加约束时 并没有使用约束命名 是允许的 系统会自动分配一个名称来标识. 但建议使用手动使用一个有意义的命名 出现错误容易判断出处
C:Foreign Key外键约束.
&1&--创建一个外键约束测试表&2&create&global&temporary&table&test_orderstatus&3&(&4&&&id&integer&constraint&order_statustest_pk&primary&key,&5&&&status_id&number(15),&6&&&status&varchar(120),&7&&&last_modifieddate&date&default&sysdate&8&);&9&<span style="color: #&--添加一列&先删除&后添加<span style="color: #&alter&table&test_orderstatus<span style="color: #&drop&&column&status_<span style="color: #&<span style="color: #&alter&table&test_orderstatus<span style="color: #&add&constraint&order_status_modify_fk&status_id&reference&order_status(id);<span style="color: #&
&&对Foreign key 使用On Delete Cascade子句.即指定当父表中删除一行记录时 回自动删除子表中于其外键关联的行记录.
<span style="color: #&--附带自动级联更新<span style="color: #&alter&table&test_orderstatus<span style="color: #&drop&&column&status_<span style="color: #&<span style="color: #&alter&table&test_orderstatus<span style="color: #&add&constraint&order_status_modify_fk&status_id&reference&order_status(id)&on&delete&cascade;
&当在删除了父表一条记录时可以不删除子表记录. 全部设置字表中于外键关联所有记录为Null 则使用On Delete Cascade Null子句. 同样加在 外键约束后位置.当删除一条父表记录时.字表所有通过当前外键同父表关联的数据都设置为空值.
D:Unique约束
<span style="color: #&--添加Unique约束<span style="color: #&alter&table&order_status<span style="color: #&add&constraint&order_status_uq&unique(status);
E:删除约束(Delete References)
<span style="color: #&--删除刚刚设置的Unique约束<span style="color: #&alter&table&order_status<span style="color: #&drop&constraint&order_status_【约束唯一标识】
当需要手动编码删除约束时. 找到约束唯一命名是关键. 所以推荐建立使用有意义的约束命名.容易识别
F:禁用约束(Disable References)
--在创建时就禁用约束alter&table&order_statusadd&constraint&order_status_uq&unique(status)&
添加约束默认是在创建后自动启用的. 创建时可以直接禁用 直接尾部加一个Disable子句&如果在创建后 在来禁用约束则使用Alter table .....Disable Constraint子句
<span style="color: #&--使用中禁用约束<span style="color: #&alert&table&order_status<span style="color: #&disable&constraint&order_status_【禁用上面创建唯一约束】
&E:启用约束(ReStart References)
<span style="color: #&--启用已经创建约束<span style="color: #&alert&table&order_status<span style="color: #&enable&constraint&order_status_
约束默认在创建后自动启用.要启用约束注意当前表中所有数据必须满足约束条件. 不然会包ORA-02293错误.当然有时为了需要可以只对新插入数据进行约束.原始依然存在,使用Alter Table.......Enable Novalidate. 默认是Enable Constraint.
--只对新插入的数据才执行当前约束alert&table&order_statusenable&novalidate&constraint&order_status_
shangmian我们在用到上面第一个Check约束时也谈到这个问题.当我们建立Check约束,因为表中在建立约束前原来还存在数据 其中这些数据有些不符合当前约束的 但是我们不想删掉. 那么使用Enable Novalidate子句就是一个很好选择, 它子对新插入的数据其约束. 原始数据进行保留.
G:延迟约束(Deferred Constraint)
延迟约束是在事务被提交时强制执行的约束.添加约束时可以通过Deferrable子句来指定约束为延迟约束. 约束一但创建以后, 就不能修改为Deferrable延迟约束.唯一办法: 删除该约束,只能在创建指定为延迟约束即可.
<span style="color: #&--当前来指定上述创建的唯一约束为延迟约束&先删除已经创建唯一约束&<span style="color: #&--在创建中再次指定为延迟<span style="color: #&alter&table&order_status<span style="color: #&drop&constraint&order_status_uq<span style="color: #&<span style="color: #&alert&table&order_status<span style="color: #&add&constraint&order_status_uq&unique&(status)&deferrable&initially&
注意上面再添加约束时. 可以将其标识为Initially Immediate 或Initially Deferred.
其中Initially Immediate意思是每次向表中添加数据,修改数据或是从表中删除数据时.都要检查这个约束.(这与约束默认行为相同). 而Initially Deferred.意思是只有事务被提交时才检查这个约束. 上述我们指定的Deferred . 即在只有事务提交时才检查该约束.
H:获取关于约束系统信息
可以通过查询User_Constraints表获得当前所有关于约束的系统信息.下面关于约束User_Constraints表常用信息字段说明:
Owner&#8212;&#8212;约束所有者
Constraint_name&#8212;&#8212;约束名称
Constraint_Type&#8212;&#8212;约束类型:C:代表Check或Not Null约束.& P:主键约束.&& R:外键约束.& U:唯一约束.& V:Check option约束.& O:Readonly 只读约束
Table&#8212;&#8212;name&#8212;&#8212;约束定义针对表名
Status_约束的状态 Enable或Disable 可用或不可用
Deferrable:是否为延迟约束 值为:Deferrable或Not Deferred.
Deferred:是否采用延迟 值为:IMMEDIate或Deferred.
<span style="color: #&--查看全部的关于order_status'表约束信息<span style="color: #&select&*&from&user_constraints&where&table_name='order_status'
shangshu是关于表的约束. 对于表中特定的列只需查询User_cons_columns表即可 不在赘述.

我要回帖

更多关于 oracle查看表的外键 的文章

 

随机推荐