例如下面我建的一个课程表Course,其中Cpno是外码,被参照表是Course本身,被参照列是Cnocreate table Course
(Cno char(9) primary key,
 Cname char(20),
 Cpno char(4),
 Ccredit smallint,
 foreign key Cpno references Course(Cno)
);当要插入数据时,Cpno必需参照Cno,所以好像存在一个问题,例如插入一个元组: insert into Course
values('1','数据库','5','4');因为第三个'5'必须参照主码Cno,要想插入主码为'5'的元组,则必须知道它的Cpno,如此下去,就是一直持续了,
后来想了一下下面的插入语句,将其得Cpno设置为空,但它参照的主码取值唯一且不空,所以还是错误的。请大家帮忙考虑一下,不胜感激……

解决方案 »

  1.   

    就像学生的选课一样,修一门之前必须要修完另一门课,而且必须是学校开的课程,即在course中已存在的课程,所以Cpno是先修课,Cno是课程号。
      

  2.   

    你插入的数据和表中的列是不是相对应的,insert into Course (列名)values('1','数据库','5','4');
      

  3.   

    create table Course
    (Cno char(9) primary key,
     Cname char(20),
     Cpno char(4),
     Ccredit smallint--,
     --foreign key Cpno references Course(Cno)
    );
    GO
    create trigger my_tr on Course
    for insert,update
    as
    if not exists(
    select top 1 1 from inserted i
    where exists(
    select top 1 1 from Course
    where Cpno=i.Cno
    )
    )
    begin
    raiserror('您插入的值不在Cno范围内,请重新输入!',16,1)
    rollback
    end
    go
      

  4.   

    虽然触发器比约束更加灵活,可以实施比 foreign key约束,check 约束更为复杂的检查和操作,但是这个问题应该是不用触发器也可以解决的!
      

  5.   

    先把完整性约束去掉,创建表,再用ALTER加上约束条件