我新手,我想问一下,A表的外键一定是B表的主键吗?
外键的主要作用究竟是什么?

解决方案 »

  1.   

    外键必须为另外一张表(父表)的主键或者唯一索引。如果要添加记录,而父表中没有则报错。反之,如果要删除父表中的记录,而子表中有记录,也会报错。但是如果在创建外键约束时,如果使用on delete cascade,则删除父表中数据时,不报错而直接把子表关联的数据删除。
    如果要删除父表,则需要加上cascade constraints,此时子表的foreign key被去除,表中记录保持不变http://blog.csdn.net/totuswhf/archive/2008/03/27/2222883.aspx
      

  2.   


    --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
      

  3.   


    --建表时设置了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