2015-11-17 57 views
0

所以我有這個疑問在MySQL:翻譯的MySQL到SQL Server

-- ----------------------------------------------------- 
-- 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服務器,但我有一些問題。

  • ON DELETE RESTRICT:我不確定這個SQL的等價物。從我可以告訴它可能是NO ACTION,但我不確定。
  • 我使用SQL小提琴(MS SQL 2014)和更換後,所有的ON DELETE RESTRICTON DELETE NO ACTION它顯示了這個錯誤:

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


後注:我已經刪除了「 `'字符和最後兩行(ENGINEDEFAULT CHARACTER SET

+0

通過SQL你是指SQL Server支持的方言? –

+0

@GordonLinoff是的。我們在MySQL中使用了所有這些函數,並且我們正在將它們翻譯成在SQL Server中使用 – Ben

回答

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

原因

You receive this error message because in SQL Server, a table cannot appear more than one time in a list of all the cascading referential actions that are started by either a DELETE or an UPDATE statement. For example, the tree of cascading referential actions must only have one path to a particular table on the cascading referential actions tree.

替代方法

To work around this problem, do not create a foreign key that will create more than one path to a table in a list of cascading referential actions.

You can enforce referential integrity in several ways. Declarative Referential Integrity (DRI) is the most basic way, but it is also the least flexible way. If you need more flexibility, but you still want a high degree of integrity, you can use triggers instead.

你的表majorequipment出現在兩個外鍵和SQL Server在這種情況下過於嚴格。

因此,您可以將約束更改爲ON UPDATE NO ACTION(僅更改其中一個就足夠了),但是您必須在代碼或觸發器中自己實現級聯更新。如果你真的需要級聯更新。

請注意,您仍然可以並且應該定義兩個外鍵。只有級聯動作應該手動實施,例如,通過觸發器,如果​​真的需要的話。

+0

不知何故,MySQL對此沒有任何問題。至於SQL,但我想不出一個辦法解決這個問題。這些字段可以單獨處理,因此可以更新一個*或*另一個*或*兩個字段。我們如何定義這個? – Ben

+0

@Ben,與MySQL相比,SQL Server在外鍵中定義級聯動作時顯得非常嚴格。當一個鍵「userdefinedcode.UDCId」改變並且這些改變必須傳播到鏈接表時,它對你的系統來說真的是一個常見的用例嗎?通常主鍵永遠不會改變...... –

+0

是的,這種情況發生的可能性不大,它更多的是在不可能的情況下發生。 – Ben