当前位置: 代码迷 >> Sql Server >> FOREIGN KEY 约束发生冲突,解决方案
  详细解决方案

FOREIGN KEY 约束发生冲突,解决方案

热度:476   发布时间:2016-04-24 09:19:29.0
FOREIGN KEY 约束发生冲突,
照着书上题例打的, --向学生选课信息表中添加4条纪录 时出错,看了好久没有找到错误

是哪里需要修改呢?


Create Database Student
 On Primary
 (Name = student_data ,
  Filename = 'E:\大学生选课系统\student.mdf' ,
  Size = 10MB ,
  Maxsize = 100MB ,
  Filegrowth = 15%) ,
 (Name = student_dat ,
  Filename = 'E:\大学生选课系统\student1.ndf' ,
  Size = 10MB ,
  Maxsize = 100MB ,
  Filegrowth = 15%)
  Log On
  (Name = student_log ,
  Filename = 'E:\大学生选课系统\student.ldf' ,
  Size = 5MB ,
  Maxsize = 25MB ,
  Filegrowth = 5MB)
  
  Go
  
  --创建学校信息
  Use Student
  Go
  Create Table stab
   (xh char(6) PRIMARY KEY ,
xm varchar(8) NOT NULL ,
xb char(2) NOT NULL DEFAULT'男' ,
csrq date NOT NULL ,
rxrj date NOT NULL ,
ssx varchar(20) NOT NULL ,
bj varchar(20) NOT NULL ,
dh char(11)
)

Go
  
  --创建教师
  Use Student
  Go
  Create Table ttab
   (jsh char(4) PRIMARY KEY ,
    xm varchar(8) NOT NULL ,
    xb char(2) NOT NULL DEFAULT'男' ,
    csrq date NOT NULL ,
rjsj date NOT NULL ,
xf varchar(10) ,
zy varchar(10) ,
zc varchar(10) ,
ssx varchar(20) NOT NULL ,
dh char(11)
    )
    
    GO
    
    --创建课程表信息
    Use Student
    Go
    Create Table ctab
     (kch char(3) PRIMARY KEY ,
      kcm varchar(20) NOT NULL UNIQUE ,
      xxkch char(3) ,
      xf tinyint NOT NULL CHECK(xf>=1 and xf<=5) ,
      xs tinyint NOT NULL CHECK(xs>=20 and xs<=120) ,
      sf tinyint NOT NULL CHECK(sf>=100 and sf<=300) ,
       )
      
       Go
      
--创建教师课程信息表
Use Student
Go
Create Table tctab
(jsh char(4) NOT NULL REFERENCES ttab(jsh) ,
 kch char(3) NOT NULL REFERENCES ctab(kch) ,
 cj smallint NOT NULL CHECK(cj>=200 and cj<=1000) ,
 PRIMARY KEY(jsh,kch)
 )
Go
 
 --创建学生选课信息表
 Use Student
 Go
 Create Table sctab
 (xh char(6) NOT NULL REFERENCES stab(xh) ,
  kch char(3) NOT NULL ,
  jsh char(4) NOT NULL ,
  cj decimal(4,1) CHECK(cj>=0 and cj<=100) ,
  PRIMARY KEY(xh,kch) ,
  FOREIGN KEY(jsh,kch) REFERENCES tctab(jsh,kch) ,
  --REFERENCES ttab(jsh) ,REFERENCES ctab(kch) ,
  )
  Go
 
  --向学生表添加数据
  Use Student
  Go
  Insert Into stab values('100013','张闻天','女','1990-9-8','2010-9-1',
  '机械系','10模具','1589766690')
  Insert Into stab VALUES('100018','孙晓亮','男','1989-5-28','2009-9-1',
  '电气系','09机电','13546780987')
  Insert Into stab VALUES ('100017','王菲','女','1991-12-1','2011-9-2',
  '计算机系','网络','15897777229')
  
  Go
  
 --向学生选课信息表中添加4条纪录
 Use Student
 Go
 Insert Into sctab values('100013','C1','0001',87)
 Insert Into sctab values('100013','C2','0001',65.7)
 Insert Into sctab values('100017','C3','0003',98)
 Insert Into sctab values('100017','C5','0004',56.8)
 Go
/*
 消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 FOREIGN KEY 约束"FK__sctab__2A4B4B5E"冲突。该冲突发生于数据库"Student",表"dbo.tctab"。
语句已终止。
消息 547,级别 16,状态 0,第 2 行
INSERT 语句与 FOREIGN KEY 约束"FK__sctab__2A4B4B5E"冲突。该冲突发生于数据库"Student",表"dbo.tctab"。
语句已终止。
消息 547,级别 16,状态 0,第 3 行
INSERT 语句与 FOREIGN KEY 约束"FK__sctab__2A4B4B5E"冲突。该冲突发生于数据库"Student",表"dbo.tctab"。
语句已终止。
消息 547,级别 16,状态 0,第 4 行
INSERT 语句与 FOREIGN KEY 约束"FK__sctab__2A4B4B5E"冲突。该冲突发生于数据库"Student",表"dbo.tctab"。
语句已终止。*/

------解决思路----------------------
創建外鍵約束後
不允許sctab表存在tctab表中沒有的數據。
即先向tctab表中插入數據,再向sctab表中插入數據。
------解决思路----------------------
因为你的表sctab引用了表tctab的(jsh,kch)作为外键
因此你试图添加数据到sctab时,必须确保tctab的(jsh,kch)有以下这些组合
'C1','0001'
'C2','0001'
'C3','0003'
'C5','0004'
  相关解决方案