基于FK关系的约束

时间:2015-10-13 23:57:07

标签: sql sql-server check-constraints

具有重要字段的两个表的结构:

TableA: Id (PK), Type
TableB: Id (PK), TableAId (FK), ReferenceId (Self-reference key)

我需要有一个约束,它会说:

TableB ReferenceId列CAN必须仅包含一个值,如果TableAId值指向Type类型值> gt的记录。 1。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

一种不需要触发器的方法具有数据冗余。

create table tableA ( id int primary key, type int, constraint unq_type_id unique (type, id) ); create table tableB ( id int primary key, type int, tableAID int, constraint fk_tableB_type_tableAID foreign key (type, tableAID) references tableA(type, id), constraint chk_type check (type > 1) ); 列放在TableB中,并在那里加上约束。并为TableA添加一个额外的唯一键作为外键:

type

这是一个黑客,但它确实完成了你想要的没有触发器。

此方法的变体不需要在两个表中重复create table tableA ( id int primary key, type int, typeIsValid as (case when type > 1 then 1 else 0 end) persisted, constraint unq_type_id unique (typeIsValid, id) ); create table tableB ( id int primary key, tableAID int, typeIsValid as (1), constraint fk_tableB_typeIsValid_tableAID foreign key (typeIsValid, tableAID) references tableA(type, id) persisted ); ,但它确实需要其他列:

do {
        System.out.println("Enter number of grades");
        if (input.hasNextInt()){
             numGrade = input.nextInt();

            if (numGrade < 0){
                 System.out.println("Your number of grades needs to positive! Try again");
                 count1++;
                 continue;
            }   
         }
        else{
            System.out.println("You did not enter a number! Try again");
            count1++;
            input.next();
            continue;
         }


}while (count1 > 0);

这甚至适用于SQL Fiddle