2014-01-20 31 views
2

我正在創建兩個表RegistrationHeader和RegistrationDetail。我如何添加一個約束,當我刪除RegistrationHeader表automayy刪除RegistrationDetail表。SQL Server中表之間的約束,刪除一個應該刪除另一個

create table RegistrationHeader(
    RegistrationNo numeric 
    ,BillingID varchar(30) not null 
    ,RegistrationDate date not null 
    ,PaymentType varchar check (PaymentType = 'CC' or PaymentType = 'PO' or PaymentType = 'Check') not null 
    ,CCNumber numeric check(CCNumber >= 15 and CCNumber <=16) 
    ,PONumber varchar(30) 
    ,CheckNumber varchar(10) 
    ,primary key(RegistrationNo) 
    ,foreign key(BillingId) references Person(UserID) 
    ,constraint CC_CCNumber_constr check(
     (PaymentType = 'CC' and CCNumber is not null) 
     or 
     (PaymentType != 'CC' and CCNumber is null) 
    ) 
    ,constraint PO_PONumber_constr check(
     (PaymentType = 'PO' and (PONumber is not null or PONumber != '')) 
     or 
     (PaymentType != 'PO' and PONumber is null) 
    ) 
    ,constraint CheckNumber_type_constr check(PaymentType != 'Check' and CheckNumber is null) 
); 

create table RegistrationDetail(
    RegistrationNo numeric 
    ,LineNumber numeric 
    ,CourseID numeric(10) not null 
    ,AttendeeID varchar(30) not null 
    primary key(RegistrationNo,LineNumber) 
); 

感謝您的幫助!

+1

SQL Server,MySQL等...? – Tom

+0

在我提到的SQL頭文件中,我會將其大寫。謝謝 – setlio

+1

沒錯。有多種類型的SQL DBMS。 – Tom

回答

5

好的文章你需要

1)建立外鍵關係RegistrationHeader.RegistrationNoRegistrationDetail.RegistrationNo

2)添加ON DELETE CASCADE之間RegistrationDetail外鍵定義

我沒有測試過這個,但我相信這應該是你在尋找的SQL Server

ALTER TABLE RegistrationDetail 
ADD CONSTRAINT FK_RegistrationHeader_RegistrationDetail_Cascade 
FOREIGN KEY (RegistrationNo) REFERENCES RegistrationDetail (RegistrationNo) ON DELETE CASCADE 
+0

如果我這樣做,我會得到:引入表'RegistrationDetail'上的FOREIGN KEY約束'FK_RegistrationHeader_RegistrationDetail_Cascade'可能會導致循環或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。 – setlio

+0

請參閱答案[這裏](http://stackoverflow.com/questions/851625/foreign-key-constraint-may-cause-cycles-or-multiple-cascade-paths)。如果您無法修改約束,則可能需要創建觸發器。 – Tom

1

約束隻影響數據庫列,如主鍵/外鍵或常規列,而不是整個表。您可以爲外鍵添加OnDeleteOnUpdate約束,以從一個表中刪除/保留refrence到其他表,而不是整個表。這是將DML(選擇,更新,插入,刪除)與DDL(創建,刪除)混合。嘗試閱讀更多關於DMLDDL的信息。

Here's 有關