質問: ユニーク制約に違反した場合の振舞いについて お世話になっております。kotsujiです。親子関係にあるテーブルで、子テーブルのユニーク制約に違反したときの振舞いが不自然に感じ、これは仕様なのか、それともバグなのか分からなかったので質問させてください。 親子関係にある2つのテーブルがあります。 ・親テーブル:parents ・子テーブル:children childrenテーブルはparentsテーブルのparent_idを参照して、parentsテーブルの一部として構成しています。 parentsテーブルの構成 childrenテーブルの構成 ※目視できるようchild_idとparent_idもshowチェックボックスにチェックしています。 ※デモ用に、簡単にユニーク制約違反になるようchild_nameをkeyにしています。 このテーブル構成で、新規データの追加作業を行います。 1.親フォームで親の名前(p1)を入力し、newボタンを押します。 2.詳細フォームが表示されたら、子供の名前(c1)を入力してsaveします。 3.追加した子供の名前(c1)が親フォームで確認できます。 当然ながら、この時点ではまだ実際のテーブルには保存されていません。 4.この状態からもう1度newボタンを押して、同じ名前の子供(c1)を追加(save)し、あえてユニーク制約に違反するようにします。本来ならここでユニーク制約に違反したメッセージが表示されると思ったのですが表示されず、先程と同様に親フォームには子供の名前(c1)が1件だけ表示されています。 同じ子供の名前なので、最初に追加した子供が表示されているように見えますが、実際はあとから追加した子供で上書きされています。その証拠に上の図のchild_idが最初に追加したchild_idと変わっています。ユニーク制約は効いておらず、さらにデータを上書きするという現象が起こっています。 そして、この時点でも当然ながら、実際のテーブルにはまだデータは追加されていません。 5.この状態で、親フォームのsaveボタンを押してテーブルにデータを保存しようとすると、ここで初めてユニーク制約に違反しているエラーメッセージが表示されます。 そして、このタイミングでスプレッドシートの親子テーブルを確認すると、エラーメッセージが出ているにもかかわらず、データが格納されています。 parentsテーブル childrenテーブル 6.この状態でもう1度saveボタンを押すと、子テーブルのユニーク制約に違反したエラーメッセージが消え、親テーブルのユニーク制約に違反したエラーメッセージに変化します。 この場合、スプレッドシートの親子テーブルの値に変化はありませんでした。 以上が今回おこった不自然な振舞いの再現です。お手数ですが、ご確認お願い致します。
回答: child テーブルにあるchild idというカラムがkeyとして設定されていないようです。child nameというカラムがkeyとされていますが、child idに変更してください。