Sql中的CASCADE错误 - Server 2008

时间:2014-01-10 21:30:20

标签: sql-server sql-server-2008 tsql

我昨天发布了这个问题并没有得到答案。 我在这里附上我的问题样本。我想创建这个DB:

CREATE DATABASE [TRYShemen];
GO 
USE [TRYShemen]
GO
CREATE TABLE Persons( 
ID VARCHAR(50) PRIMARY KEY, 
FullName VARCHAR(50) NOT NULL
);  



CREATE TABLE Class( 
ClassNum VARCHAR(30) PRIMARY KEY,
Teacher VARCHAR(50) NOT NULL,

constraint Class_FK foreign key (Teacher) references  Persons (ID) ON DELETE NO ACTION ON UPDATE CASCADE,

); 

CREATE TABLE Students(
 StudentID VARCHAR(50) ,
 ClassNum VARCHAR(30) 

 constraint Students_PK PRIMARY KEY (StudentID, ClassNum),

constraint Students_FK foreign key (StudentID) references  Persons(ID) ON DELETE NO ACTION ON UPDATE CASCADE , 
 constraint Students_FK1 foreign key (ClassNum) references  Class(ClassNum)  ON DELETE NO ACTION ON UPDATE CASCADE
 );

我收到错误:

Introducing FOREIGN KEY constraint 'Students_FK1' on table 'Students' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

我知道如果我将'Students_FK1'更改为ON CASCADE NO ACTION,它会起作用,但它不是我的目标。我希望如果'Person'的id将更新,它也将在Students表中更新。

我该如何解决?

谢谢!!

2 个答案:

答案 0 :(得分:2)

请注意,它表示“可能导致循环或多个级联路径”。如果您通过ER图表执行删除操作,您可能会发现删除操作通过多个路径级联到同一个表。

在这种情况下,想象同一个人既是班级中的老师又是学生。是的,我知道,这是一个逻辑错误,但如果这个条件为真,那么对该人的更新将通过两条路线级联到学生表。

答案 1 :(得分:2)

那么你能做些什么呢?

将此结构视为替代方案。

表人员
表学生
表教师
表类
表Classes_to_Teachers
table-Classes_to_Students

然后你可以为中心提供级联参考 人员 - >学生&学生 - > Classes_to_Students
人员 - >教师&教师 - > Classes_to_Teachers

当您访问数据时,您将有更多连接来获取一个类的所有数据。 但是限制应该成功。