仅当特定值时,Oracle SQL才会约束2列值

时间:2017-10-16 21:00:12

标签: sql oracle constraints unique-constraint

我有3个表格的问题,答案和user_answers。所有问题都在答案表中设置了相关答案,用户答案与answer_id一起存储在user_answer表中。

想象一下一个复选框类型调查,其中一个问题带有一个单选按钮。

我想知道是否可以将user_answers表限制为仅针对该特定question_id允许每个user_id 1个答案,但允许所有其他问题的多个答案。

我已经研究过解决方案,但找不到符合我具体用例的任何内容。

感谢任何帮助, 谢谢!

1 个答案:

答案 0 :(得分:0)

你有三张桌子:

  • 问题(QID,QTYPE,...)
  • 答案(AID,QID,......)
  • USER_ANSWERS(UAID,QID,AID,UID(用户ID),...)

如果问题可能有多个答案,答案中会有多个答案("检查所有适用的答案和#34;问题类型),用户可以查看多个答案,相同(QID,UID)但在USER_ANSWERS中具有不同的AID。如果允许一个选择,ANSWERS中将有多个答案,但用户只能选择一个,从而在USER_ANSWERS中产生对(QID,UID)的单个引用。

我的建议如下 - 强制数据库级别

  1. 在ANSWERS中引入一个新专栏:AQ_REF(答案问题参考)。如果问题类型仅允许单个答案,则使用QID填充;当问题类型允许的不仅仅是答案时使用AID
  2. 除了USER_ANSWERS
  3. 中的AID之外,还可以使用此功能

    现在,你有这样的表结构:

    • 问题(QID,QTYPE,...) - PRIMARY KEY(QID)
    • ANSWERS(AID,QID,AQ_REF,...) - PRIMARY KEY(AID),FOREIGN KEY(QID),UNIQUE(AID,AQ_REF),CHECK AQ_REF IN(AID,QID)
    • USER_ANSWERS(UAID,AID,AQ_REF,UID,...) - PRIMARY KEY(UAID),FOREIGN KEY(AID,AQ_REF)参考答案(AID,AQ_REF),UNIQUE(AQ_REF,UID)

    示例数据:

    <强>问题:

    QID,QTYPE

    Q1,&#39; S&#39; - 单个答案

    Q2,&#39; M&#39; - 多个答案

    <强>解答:

    AID,QID,AQ_REF

    A1,Q1,Q1 - 请注意,所有Q1答案都有AQ_REF = Q1

    A2,Q1,Q1

    A3,Q1,Q1

    A4,Q2,A4 - 注意这有AQ_REF = A4

    A5,Q2,A5 - 注意这有AQ_REF = A5

    A6,Q2,A6 - 注意这有AQ_REF = A6

    <强> USER_ANSWERS:

    UAID,AID,AQ_REF,UID

    UA1,A1,Q1,U1

    UA2,A4,A4,U1

    UA3,A6,A6,U1