主外键问题 我新手,我想问一下,A表的外键一定是B表的主键吗?外键的主要作用究竟是什么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 外键必须为另外一张表(父表)的主键或者唯一索引。如果要添加记录,而父表中没有则报错。反之,如果要删除父表中的记录,而子表中有记录,也会报错。但是如果在创建外键约束时,如果使用on delete cascade,则删除父表中数据时,不报错而直接把子表关联的数据删除。如果要删除父表,则需要加上cascade constraints,此时子表的foreign key被去除,表中记录保持不变http://blog.csdn.net/totuswhf/archive/2008/03/27/2222883.aspx --1.A表的外键一定要参照B表的主键,否则你将会得到下面的错误:SQL> create table t( 2 col_1 number(2) primary key, 3 col_2 varchar2(10));Table createdSQL> create table t3( 2 col_1 varchar2(3) references t(col_2), 3 col_2 number(3)) 4 / ORA-02270: no matching unique or primary key for this column-listSQL> create table t3( 2 col_1 number(2) references t(col_1), 3 col_2 varchar2(3)) 4 /Table created--2.你可以使用on delete cascade和on delete set null来建立外键SQL> create table table_1( 2 ta_1 number(2) primary key, 3 ta_2 varchar2(10));SQL> SQL> create table table_2( 2 tb_1 number(2), 3 tb_2 varchar2(10));SQL> alter table table_2 2 add constraint fk_tb_2 foreign key(tb_1) references table_1(ta_1) 3 on delete cascade;SQL> select * from table_1;TA_1 TA_2---- ---------- 1 monday 7 sundaySQL> select * from table_2;TB_1 TB_2---- ---------- 1 yesSQL> delete from table_1 where ta_1=1;1 row deletedSQL> select * from table_1;TA_1 TA_2---- ---------- 7 sundaySQL> select count(*) from table_2; COUNT(*)---------- 0--外键的主要作用究竟是什么?--外键用来约束数据的完整性的,--假设你的emp表中有个属性叫deptno,本来应该参照dept表中的deptno主键的,--单是你并没有那么做,--所以可能在emp中出现这样的数据:员工的deptno号不存在于dept表中的deptno.参考:http://www.cnblogs.com/jimeper/archive/2008/11/03/1325896.html --建表时设置了on cascade级联的,在删除表时,--首先将子表(参照表)删除,在删除父表(被参照表)--否则你将会看到下面的错误:SQL> drop table table_1;drop table table_1ORA-02449: unique/primary keys in table referenced by foreign keys--先删除子表table_2,在删除table_1SQL> drop table table_2;Table droppedSQL> drop table table_1;Table dropped oracle自动建表 RAMN备份遇到的问题 [提问]关于RMAN的工作过程 求救!!!解决办法 ORA-01555&ORA-06512(存储过程改动) 没分~初学ORCAL 谁告诉我个ORCAL的作业怎么写啊 最好有例子 谢谢 关于数据库碎片整理 往taskbox.project_manage表中的date型列中插入时出现的问题 紧急求救:oracle和sql server 2000相互转化的问题 oracle9i初装问题,请指教!谢谢!(1) 求助!64位win7,安装plsql出错! sql 语句 查询, sql一个查询问题?
如果要删除父表,则需要加上cascade constraints,此时子表的foreign key被去除,表中记录保持不变http://blog.csdn.net/totuswhf/archive/2008/03/27/2222883.aspx
--1.A表的外键一定要参照B表的主键,否则你将会得到下面的错误:
SQL> create table t(
2 col_1 number(2) primary key,
3 col_2 varchar2(10));
Table created
SQL> create table t3(
2 col_1 varchar2(3) references t(col_2),
3 col_2 number(3))
4 /
ORA-02270: no matching unique or primary key for this column-list
SQL> create table t3(
2 col_1 number(2) references t(col_1),
3 col_2 varchar2(3))
4 /
Table created
--2.你可以使用on delete cascade和on delete set null来建立外键
SQL> create table table_1(
2 ta_1 number(2) primary key,
3 ta_2 varchar2(10));SQL>
SQL> create table table_2(
2 tb_1 number(2),
3 tb_2 varchar2(10));SQL> alter table table_2
2 add constraint fk_tb_2 foreign key(tb_1) references table_1(ta_1)
3 on delete cascade;SQL> select * from table_1;
TA_1 TA_2
---- ----------
1 monday
7 sundaySQL> select * from table_2;
TB_1 TB_2
---- ----------
1 yes
SQL> delete from table_1 where ta_1=1;1 row deletedSQL> select * from table_1;
TA_1 TA_2
---- ----------
7 sundaySQL> select count(*) from table_2;
COUNT(*)
----------
0
--外键的主要作用究竟是什么?
--外键用来约束数据的完整性的,
--假设你的emp表中有个属性叫deptno,本来应该参照dept表中的deptno主键的,
--单是你并没有那么做,
--所以可能在emp中出现这样的数据:员工的deptno号不存在于dept表中的deptno.参考:http://www.cnblogs.com/jimeper/archive/2008/11/03/1325896.html
--建表时设置了on cascade级联的,在删除表时,
--首先将子表(参照表)删除,在删除父表(被参照表)
--否则你将会看到下面的错误:
SQL> drop table table_1;
drop table table_1ORA-02449: unique/primary keys in table referenced by foreign keys
--先删除子表table_2,在删除table_1
SQL> drop table table_2;
Table droppedSQL> drop table table_1;
Table dropped