将MySQL翻译成SQL Server

时间:2015-11-17 01:35:28

标签: mysql sql-server

所以我在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约束。

后注:我已经删除了'`'字符和最后两行(ENGINEDEFAULT CHARACTER SET

1 个答案:

答案 0 :(得分:0)

在您的表定义中,两个外键PACIdETId指向另一个表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进行此配置。

Error message 1785 occurs when you create a FOREIGN KEY constraint that may cause multiple cascade paths

<强>原因

  

您收到此错误消息,因为在SQL Server中,表不能   在所有级联参照的列表中出现不止一次   由DELETE或UPDATE语句启动的操作。   例如,级联引用操作树必须只有   级联引用操作的特定表的一个路径   树。

解决方法

  

要解决此问题,请不要创建将要使用的外键   在级联列表中创建多个表的路径   参考行动。

     

您可以通过多种方式强制实施参照完整性。陈述   参考完整性(DRI)是最基本的方式,但它也是   最灵活的方式。如果你需要更多的灵活性,但你仍然想要一个   高度完整性,您可以使用触发器。

您的表majorequipment出现在两个外键中,而SQL Server在这种情况下过于严格。

因此,您可以将约束更改为ON UPDATE NO ACTION(只更改两者中的一个就足够了),但您必须自己在代码或触发器中实现级联更新。如果你真的需要级联更新。

请注意,您仍然可以并且应该定义两个外键。只有手动实现级联操作,例如,如果确实需要,则通过触发器实现。