具有重要字段的两个表的结构:
TableA: Id (PK), Type
TableB: Id (PK), TableAId (FK), ReferenceId (Self-reference key)
我需要有一个约束,它会说:
TableB ReferenceId列CAN必须仅包含一个值,如果TableAId值指向Type类型值> gt的记录。 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。