Oracle SQL 仅当某些值时才限制 2 列值

Oracle SQL constrain 2 columns values only if certain values

我有 3 table 个问题、答案和 user_answers。所有问题在答案 table 中都有一个相关的答案集,用户的答案与答案所在的 question_id 一起存储在 user_answer table 中。

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

我想知道是否可以限制 user_answers table 对于特定 question_id 每个 user_id 只允许 1 个答案,但允许多个答案所有其他问题。

我研究了解决方案,但找不到完全符合我的特定用例的内容。

感谢任何帮助, 谢谢!

你有三个 table:

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

在一个问题可能有多个答案的情况下,ANSWERS 中将有多个答案("check all that applies" 类型的问题),用户可以检查很多,从而导致对相同(QID, UID) 但在 USER_ANSWERS 中有不同的 AID。如果允许一个 selection,ANSWERS 中将有多个答案,但用户只能 select 个,导致 USER_ANSWERS 中对 (QID, UID) 的单个引用。

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

  1. 在 ANSWERS 中引入一个新列:AQ_REF(回答问题参考)。当问题类型只允许一个答案时,这会用 QID 填充,当问题类型允许多个答案时,它会用 AID 填充
  2. 在 USER_ANSWERS
  3. 中除了 AID 之外还使用这个

现在,您的 table 结构如下:

  • 问题(QID、QTYPE、...)-- 主键 (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, ...) -- 主键(UAID), 外键(AID, AQ_REF) 参考答案(AID , AQ_REF), UNIQUE(AQ_REF, UID)

示例数据:

问题:

QID,QTYPE

Q1,'S' -- 单一答案

Q2,'M' -- 多个答案

答案:

AID,QID,AQ_REF

A1, Q1, Q1 -- 注意这有 AQ_REF = Q1 对于所有 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