2012-11-19 90 views
3

我正在設計一個數據庫模式,而我被困在一個部分。以下是我的模式的簡化版本。可能有人請解釋爲什麼下面的SQL:SQL Server ON DELETE CASCADE錯誤

CREATE TABLE Users (
    UserID INT NOT NULL PRIMARY KEY, 
    FName VARCHAR(64) NOT NULL, 
    LName VARCHAR(64) NOT NULL, 
    UName VARCHAR(64) NOT NULL UNIQUE, 
    PWord CHAR(32) NOT NULL, 
    Role VARCHAR(13) NOT NULL 
); 

... 

CREATE TABLE Sale (
    SaleID INT NOT NULL PRIMARY KEY, 
    Book INT NOT NULL REFERENCES Books(BookID) ON DELETE NO ACTION, 
    Merchant INT NOT NULL REFERENCES Users(UserID) ON DELETE CASCADE, 
    Upload DATETIME NOT NULL, 
    Sold BIT NOT NULL, 
    Price DECIMAL(10, 2) NOT NULL, 
    Condition VARCHAR(9) NOT NULL, 
    Written BIT NOT NULL, 
    Comments VARCHAR(8000) NULL 
); 

... 

CREATE TABLE Purchases (
    PurchaseID INT NOT NULL PRIMARY KEY, 
    Buyer INT NOT NULL REFERENCES Users(UserID) ON DELETE CASCADE, 
    Merchant INT NOT NULL REFERENCES Users(UserID) ON DELETE NO ACTION, 
    Sale INT NOT NULL REFERENCES Sale(SaleID) ON DELETE CASCADE UNIQUE, 
    Time DATETIME NOT NULL 
); 

...導致這個錯誤,以及我如何克服它:

Msg 1785, Level 16, State 0, Line 38 
Introducing FOREIGN KEY constraint 'FK__Purchases__Sale__25869641' on table 
'Purchases' may cause cycles or multiple cascade paths. Specify ON DELETE 
NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. 

我想保持ON DELETE CASCADEPurchases.Sale屬性,如果可能的話。

謝謝你的時間。

+0

'購買'看起來多餘 –

+0

@OMGPonies事實證明,在應用程序的上下文中,它起着重要的作用。 –

回答

4

很可能是因爲您從兩個不同的表中引用「用戶」 - 「採購」中的「買方」和「銷售商家」。數據庫可能沒有意識到這兩個記錄是不一樣的 - 但它知道它是同一個表,因此抱怨級聯存在潛在的問題。

+0

嗯......有趣。任何想法可以做些什麼來克服這個問題? –

+3

也許是一個觸發器。很多討論在這裏:http://stackoverflow.com/questions/1637708/what-is-the-problem-with-foreign-key-cascade-multiple-paths-and-cycles?lq=1和這裏:http:/ /stackoverflow.com/questions/851625/foreign-key-constraint-may-cause-cycles-or-multiple-cascade-paths –

+0

好的...我知道觸發器是最後的手段,但如果這是唯一的方法這將解決這個問題,那麼我會採取這種方法。謝謝你,亞瑟。 –