假设我有以下表格:
问题,选择和答案
每个问题都有很多选择(选择具有question_id
外键。)
Answers表具有两个外键question_id
和choice_id
,这些约束可防止引用不存在的question
或choice
的答案,但是我想要也可以防止无效选择。
我如何表达一个约束(也许不是正确的词),该约束仅在choice_id
是给定question_id
的有效选择的情况下才允许答案?例如,如果我有2个问题,每个问题有2个选择:
我想允许类似(question_id
= 1,choice_id
= 1(或2)的答案,并禁止类似({{11}} = 1,question_id
= 4的答案),因为这不是该问题的有效选择。
答案 0 :(得分:6)
您所需要的只是从extension UITextField {
func clear () {
self.layer.sublayers?.forEach {
if $0 is CAGradientLayer {
$0.removeFromSuperlayer()
}
}
}
func underlined(){
clear()
let color = UIColor(red: 11/255, green: 95/255, blue: 244/255, alpha: 1).cgColor
let sndColor = UIColor(red: 124/255, green: 206/255, blue: 254/255, alpha: 1).cgColor
let gradient: CAGradientLayer = CAGradientLayer()
gradient.colors = [color, sndColor]
gradient.locations = [0.0, 0.8]
gradient.startPoint = CGPoint(x: 0, y: 0)
gradient.endPoint = CGPoint(x: 1, y: 0)
let width = CGFloat(3.0)
gradient.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height)
self.layer.insertSublayer(gradient, at: 0)
self.layer.masksToBounds = true
}
func underlinedGrey(){
clear()
let color = UIColor(red: 112/255, green: 112/255, blue: 112/255, alpha: 0.4).cgColor
let border = CALayer()
let width = CGFloat(3.0)
border.borderColor = color
border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height)
border.borderWidth = width
self.layer.addSublayer(border)
self.layer.masksToBounds = true
}
}
到answer
的{{3}}-choice
中的行指向一个适用问题。
如果您坚持要冗余地创建choice
列(在某些特殊情况下这很有意义)仍然只有一个 multicolumn FK约束跨越两个列。这首先需要对表answer.question_id
进行匹配的多列UNIQUE
(或PK)约束(否则通常也是多余的):
choice
然后:
ALTER TABLE choice ADD CONSTRAINT choice_uni UNIQUE (question_id, choice_id);
所有涉及的列都是ALTER TABLE answer ADD constraint answer_choice_fkey
FOREIGN KEY (question_id, choice_id) REFERENCES choice(question_id, choice_id);
,或者您可能需要做更多:在这种情况下,首先了解外键约束的不同匹配类型:
相关:
答案 1 :(得分:3)
您的“答案”表为什么有一个question_id
?
如果仅具有choice_id
,它将始终引用现有的选择。选择本身会链接到有效问题,从而唯一确定给定答案用于哪个问题。