2014-01-20 70 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 有关