Sql server 在SQL代码中找不到多个级联路径或循环的位置?
我一直得到以下错误 味精1785,16级,状态0,第99行 在表>“linkUserGroup”上引入外键约束“FK_linkUserGroup_tblStudent”可能会导致循环或多个级联路径。指定删除时?>无操作或更新时无操作,或修改其他外键约束。 Msg 1750,16级,状态0,第99行 无法创建约束或索引。请参阅前面的错误 我无法理解一个循环或多个级联路径是如何可能的?我也无法理解为什么对TeacherID的FK约束不会导致相同的问题?我的理解是,如果要删除父StudentID,那么通过指定在删除时在子表中不执行任何操作来确保记录不会从子表中删除。我不明白他们怎么会有其他的路径或可能的循环?请帮忙Sql server 在SQL代码中找不到多个级联路径或循环的位置?,sql-server,Sql Server,我一直得到以下错误 味精1785,16级,状态0,第99行 在表>“linkUserGroup”上引入外键约束“FK_linkUserGroup_tblStudent”可能会导致循环或多个级联路径。指定删除时?>无操作或更新时无操作,或修改其他外键约束。 Msg 1750,16级,状态0,第99行 无法创建约束或索引。请参阅前面的错误 我无法理解一个循环或多个级联路径是如何可能的?我也无法理解为什么对TeacherID的FK约束不会导致相同的问题?我的理解是,如果要删除父StudentID,那么
CREATE TABLE tblUserAccount (
uaUserAccountID INT IDENTITY (1,1) CONSTRAINT PK_tblUserAccount PRIMARY KEY CLUSTERED,
uaUserAccountTitle NVARCHAR (50) NOT NULL,
uaUserAccountFirstName NVARCHAR (50) NOT NULL,
uaUserAccountSurname NVARCHAR (50) NOT NULL,
uaUserAccountUserName NVARCHAR (50) NOT NULL,
uaUserAccountPassword NVARCHAR (50) NOT NULL,
uaDateTimeModified DATETIME
CONSTRAINT DF_tblUserAccount_DateTimeModified DEFAULT SYSDATETIME()
);
CREATE TABLE tblRole (
rRoleID INT IDENTITY (1, 1) CONSTRAINT PK_tblRole PRIMARY KEY CLUSTERED,
rRole NVARCHAR (50),
rRoleDescription NVARCHAR (MAX) NULL,
rDateTimeModified DATETIME
CONSTRAINT DF_tblRole_DateTimeModified DEFAULT SYSDATETIME()
);
CREATE TABLE linkUserAccountRole (
uarUserAccountID INT,
uarRoleID INT,
uarDateTimeModified DATETIME
CONSTRAINT DF_linkUserAccountRole_DateTimeModified DEFAULT SYSDATETIME()
,CONSTRAINT PK_linkUserAcccountRole
PRIMARY KEY CLUSTERED (uarUserAccountID , uarRoleID)
,CONSTRAINT FK_linkUserAcccountRole_tblRole
FOREIGN KEY (uarRoleID)
REFERENCES tblRole (rRoleID)
ON DELETE NO ACTION
ON UPDATE CASCADE
,CONSTRAINT FK_linkUserAcccountRole_tblUserAccount
FOREIGN KEY (uarUserAccountID)
REFERENCES tblUserAccount (uaUserAccountID)
ON DELETE NO ACTION
ON UPDATE CASCADE
);
CREATE TABLE tblTeacher (
tTeacherID INT CONSTRAINT PK_tblTeacher PRIMARY KEY CLUSTERED,
tUserAccountID INT,
tDateTimeModified DATETIME
CONSTRAINT DF_tblTeacher_DateTimeModified DEFAULT SYSDATETIME(),
CONSTRAINT FK_tblTeacher_tblUserAccount
FOREIGN KEY (tUserAccountID)
REFERENCES tblUserAccount(uaUserAccountID)
ON DELETE CASCADE
ON UPDATE CASCADE
);
CREATE TABLE tblStudent (
sStudentID INT CONSTRAINT PK_tblStudent PRIMARY KEY CLUSTERED,
sUserAccountID INT,
sDateTimeModified DATETIME
CONSTRAINT DF_tblStudent_DateTimeModified DEFAULT SYSDATETIME(),
CONSTRAINT FK_tblStudent_tblUserAccount
FOREIGN KEY (sUserAccountID)
REFERENCES tblUserAccount(uaUserAccountID)
ON DELETE CASCADE
ON UPDATE CASCADE
);
CREATE TABLE tblKeyStage (
ksKeyStageGroupID INT IDENTITY (1,1) CONSTRAINT PK_tblKeyStage PRIMARY KEY CLUSTERED,
ksKeyStageTitle NVARCHAR (50) NOT NULL,
ksKeyStageDescription NVARCHAR(50),
ksDateTimeModified DATETIME
CONSTRAINT DF_tblKeyStage_DateTimeModified DEFAULT SYSDATETIME()
,CONSTRAINT UQ_tblKeyStage_KeyStageTitle UNIQUE (ksKeyStageTitle)
);
CREATE TABLE tblYearGroup (
ygYearGroupID INT IDENTITY (1,1) CONSTRAINT PK_tblYearGroup PRIMARY KEY CLUSTERED,
ygYearGroupTitle NVARCHAR (50) NOT NULL,
ygYearGroupDescription NVARCHAR(50),
ygDateTimeModified DATETIME
CONSTRAINT DF_tblYearGroup_DateTimeModified DEFAULT SYSDATETIME()
,CONSTRAINT UQ_tblYearGroup_YearGroupTitle UNIQUE (ygYearGroupTitle)
);
CREATE TABLE tblClassGroup (
cgClassGroupID INT IDENTITY (1,1) CONSTRAINT PK_tblClassGroup PRIMARY KEY CLUSTERED,
cgClassGroupTitle NVARCHAR (50) NOT NULL,
cgClassGroupDescription NVARCHAR (50),
cgDateTimeModified DATETIME
CONSTRAINT DF_tblClassGroup_DateTimeModified DEFAULT SYSDATETIME()
,CONSTRAINT UQ_tblClassGroup_ClassGroupTitle UNIQUE (cgClassGroupTitle)
);
CREATE TABLE tblLearningGroup (
lgLearningGroupID INT IDENTITY (1,1) CONSTRAINT PK_tblLearningGroup PRIMARY KEY CLUSTERED,
lgLearningGroupTitle NVARCHAR (50) NOT NULL,
lgLearningGroupDescription NVARCHAR (50),
lgDateTimeModified DATETIME
CONSTRAINT DF_tblLearningGroup_DateTimeModified DEFAULT SYSDATETIME()
,CONSTRAINT UQ_tblLearningGroup_LearningGroupTitle UNIQUE (lgLearningGroupTitle)
);
CREATE TABLE tblLearningGroup (
lgLearningGroupID INT IDENTITY (1,1) CONSTRAINT PK_tblLearningGroup PRIMARY KEY CLUSTERED,
lgLearningGroupTitle NVARCHAR (50) NOT NULL,
lgLearningGroupDescription NVARCHAR (50),
lgDateTimeModified DATETIME
CONSTRAINT DF_tblLearningGroup_DateTimeModified DEFAULT SYSDATETIME()
,CONSTRAINT UQ_tblLearningGroup_LearningGroupTitle UNIQUE (lgLearningGroupTitle)
);
CREATE TABLE linkUserGroup (
ugTeacherID INT,
ugStudentID INT,
ugKeyStageGroupID INT,
ugYearGroupID INT,
ugClassGroupID INT,
ugLearningGroupID INT,
ugDateTimeModified DATETIME
CONSTRAINT DF_linkUserGroup_DateTimeModified DEFAULT SYSDATETIME()
,CONSTRAINT PK_linkUserGroup
PRIMARY KEY CLUSTERED (ugTeacherID, ugStudentID, ugClassGroupID, ugLearningGroupID)
,CONSTRAINT FK_linkUserGroup_tblTeacher
FOREIGN KEY (ugTeacherID)
REFERENCES tblTeacher (tTeacherID)
ON DELETE NO ACTION
ON UPDATE CASCADE
,CONSTRAINT FK_linkUserGroup_tblStudent
FOREIGN KEY (ugStudentID)
REFERENCES tblStudent (sStudentID)
ON DELETE NO ACTION
ON UPDATE CASCADE
,CONSTRAINT FK_linkUserGroup_tblKeyStage
FOREIGN KEY (ugKeyStageGroupID)
REFERENCES tblKeyStage (ksKeyStageGroupID)
ON DELETE NO ACTION
ON UPDATE CASCADE
,CONSTRAINT FK_linkUserGroup_tblYearGroup
FOREIGN KEY (ugYearGroupID)
REFERENCES tblYearGroup (ygYearGroupID)
ON DELETE NO ACTION
ON UPDATE CASCADE
,CONSTRAINT FK_linkUserGroup_tblClassGroup
FOREIGN KEY (ugClassGroupID)
REFERENCES tblClassGroup (cgClassGroupID)
ON DELETE NO ACTION
ON UPDATE CASCADE
,CONSTRAINT FK_linkUserGroup_tblLearningGroup
FOREIGN KEY (ugLearningGroupID)
REFERENCES tblLearningGroup (lgLearningGroupID)
ON DELETE NO ACTION
ON UPDATE CASCADE
,CONSTRAINT UQ_linkUserGroup_PK_YearGroupID
UNIQUE (ugTeacherID, ugStudentID, ugClassGroupID, ugLearningGroupID, ugYearGroupID)
);
tblUserAccount和linkUserGroup之间存在多个级联路径: 不允许的不是FK约束本身,而是操作:更新级联 您可以为FK_linkUserGroup_TBLTacher指定更新级联,也可以为FK_linkUserGroup_tblStudent指定更新级联,但不能同时为两者指定 您的ON DELETE已标记为无操作,因此可以。这是更新,你应该决定做什么 有两种选择: 1禁止更新参与FK约束的密钥 要做到这一点,请指定onupdate不执行任何操作,或者干脆删除onupdate子句,因为这是外键约束的默认行为 考虑到更新主键通常不是一个好主意,不管它是否被外键引用,我建议使用此选项 2如果更改后的sStudentID和tTeacherID自动传播到linkUserGroup是您真正想要的,那么您可以使用触发器
tblUserAccount -> tblTeacher -> linkUserGroup
tblUserAccount -> tblStudent -> linkUserGroup