所以我在MySQL中有这个查询:
-- -----------------------------------------------------
-- Table majorequipment
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `majorequipment` (
`MEId` INT(11) NOT NULL AUTO_INCREMENT,
`PACId` INT(11) NULL DEFAULT NULL,
`EquipmentNumber` VARCHAR(255) NULL DEFAULT NULL,
`Comments` TEXT NULL DEFAULT NULL,
`ETId` INT(11) NULL DEFAULT NULL,
`Status` VARCHAR(100) NULL DEFAULT NULL,
`Description` VARCHAR(255) NULL DEFAULT NULL,
`Removed` TINYINT(1) NOT NULL DEFAULT '0',
`Active` TINYINT(1) NULL DEFAULT '1',
PRIMARY KEY (`MEId`),
INDEX `PACId` (`PACId` ASC),
INDEX `ETId` (`ETId` ASC),
INDEX `fk_majorequipment_status_idx` (`Status` ASC),
CONSTRAINT `fk_majorequipment_userdefinedcode_PACId`
FOREIGN KEY (`PACId`)
REFERENCES `userdefinedcode` (`UDCId`)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT `fk_majorequipment_userdefinedcode_ETId`
FOREIGN KEY (`ETId`)
REFERENCES `userdefinedcode` (`UDCId`)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT `fk_majorequipment_status`
FOREIGN KEY (`Status`)
REFERENCES `componentstatus` (`StatusName`)
ON DELETE RESTRICT
ON UPDATE CASCADE)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
我正在尝试将其转换为SQL Server,但我遇到了一些问题。
ON DELETE RESTRICT
:我不确定SQL的等价物。据我所知,它可能是NO ACTION
,但我不确定。我正在使用SQL Fiddle(MS SQL 2014),在用ON DELETE RESTRICT
替换所有ON DELETE NO ACTION
后,它显示了以下错误:
介绍FOREIGN KEY约束' fk_majorequipment_userdefinedcode_ETId'在桌子上' majorequipment'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
后注:我已经删除了'`'字符和最后两行(ENGINE
和DEFAULT CHARACTER SET
)
答案 0 :(得分:0)
在您的表定义中,两个外键PACId
和ETId
指向另一个表UDCId
中的相同主字段。
CONSTRAINT `fk_majorequipment_userdefinedcode_PACId`
FOREIGN KEY (`PACId`)
REFERENCES `userdefinedcode` (`UDCId`)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT `fk_majorequipment_userdefinedcode_ETId`
FOREIGN KEY (`ETId`)
REFERENCES `userdefinedcode` (`UDCId`)
ON DELETE RESTRICT
ON UPDATE CASCADE,
显然,SQL Server不支持使用ON UPDATE CASCADE
进行此配置。
<强>原因强>
您收到此错误消息,因为在SQL Server中,表不能 在所有级联参照的列表中出现不止一次 由DELETE或UPDATE语句启动的操作。 例如,级联引用操作树必须只有 级联引用操作的特定表的一个路径 树。
解决方法强>
要解决此问题,请不要创建将要使用的外键 在级联列表中创建多个表的路径 参考行动。
您可以通过多种方式强制实施参照完整性。陈述 参考完整性(DRI)是最基本的方式,但它也是 最灵活的方式。如果你需要更多的灵活性,但你仍然想要一个 高度完整性,您可以使用触发器。
您的表majorequipment
出现在两个外键中,而SQL Server在这种情况下过于严格。
因此,您可以将约束更改为ON UPDATE NO ACTION
(只更改两者中的一个就足够了),但您必须自己在代码或触发器中实现级联更新。如果你真的需要级联更新。
请注意,您仍然可以并且应该定义两个外键。只有手动实现级联操作,例如,如果确实需要,则通过触发器实现。