私はユーザがのタスクを作成して編集できるプログラムを持っています。各タスクは0〜n の質問を割り当てられます。テーブルに挿入 - キーがnullの場合の重複を破棄
ユーザがタスクを編集しているときに、(1)削除または(2)編集のいずれかの質問のリストが提示されます。また、(3)質問のリストに新しい質問を追加することもできます。
各質問には、割り当てられたメンバーとの関係があるため、進捗状況を追跡することができます。これはtask_data_table
で行われます。テーブルの
task_data_table
============================================================================
| Field | Type | Null | Key | Default | Extra |
============================================================================
| id | int(11) | no | PRI | Null | auto_increment |
| completion_date | timestamp | yes | | | |
| answer | varchar(255) | yes | | | |
| task_id | int(11) | yes | MUL | | |
| question_id | int(11) | yes | MUL | | |
| member_id | int(11) | yes | MUL | | |
----------------------------------------------------------------------------
内容は次のようになります。それは特定のために他のに対して、全体としてのタスクのために使用されているため、上記
=========================================================================
| id | completion_date | answer | task_id | question_id | member_id |
=========================================================================
| 1 | 2016-05-13 11:00:00 | NULL | 20 | NULL | 2 |
| 2 | 2016-05-13 11:00:00 | yes | 20 | 8 | 2 |
| 3 | 2016-05-13 11:00:00 | no | 20 | 9 | 2 |
-------------------------------------------------------------------------
最初のエントリはNULL
に等しいquestion_id
を有します質問。また、それぞれの質問はタスクに固有のものです。
私は変更を提出する際に、ループやデータベースに対して行われ、不要なチェックの量を減らすことによって、いくつかのバックエンドのロジックとクエリ時間を最適化しようとしています。私がこれをやってみた1つの方法は、INSERT INTO
を実行する前に、上記のメンバーと質問のtask_data
が既に存在する場合、データベースに対してチェックを行う必要がないように、question_id
との組み合わせでtask_id
を与えることでした。だから私はやった:
ALTER TABLE task_data_table ADD UNIQUE unique_index (question_id, student_member_id);
しかし、私はちょうどドキュメントから出た:
UNIQUEインデックス私が見てきた
NULLを含めることができる列に対して複数のNULL値を許可しますこの問題を解決する方法を紹介しましたが、NULL
の代わりに0
をデフォルト値として使用することを提案しました。残念ながら、task_id
とquestion_id
の両方が外部キーであるため、これは不可能です。
IF NOT EXISTS
またはNOT IN
で見つかったクエリを試しましたが、機能しませんでした。この問題をどうやって解決するのですか?
MySQLでは、この機能にはトリガーが必要だと思います。 –
@GordonLinoff、うーん...このトリガーがどのように機能するのか説明できますか? – Chris