以前こちらの質問をさせていただきました。
https://teratail.com/questions/157540
現状以下のようなテーブルがあります。
article id: integer title: string deleted_article id: integer article_id: integer title: string
articleを削除後、deleted_articleに情報を退避する感じです。
ここで上記質問に書いてあるid再利用がarticleテーブルで起きてしまうため以下のような状況になってしまいます。
articleテーブル
id | title |
---|---|
3 | title3 |
4 | title4 |
5 | title5 |
1 | title6 |
deleted_articleテーブル
id | article_id | title |
---|---|---|
1 | 1 | title1 |
2 | 2 | title2 |
ここでdeleted_articleのarticle_idはuniqueなので、title: "title6"
の記事が削除できなくなっています。
前回の質問では
対策としては ・外部キー制約入れる ・AUTO_INCREMENTに頼らず、別に採番テーブルを用意する ・論理削除してレコードを delete しない(!)
と対策を教えていただきました。
手段として、
・AUTO_INCREMENTに頼らず、別に採番テーブルを用意する
・論理削除してレコードを delete しない(!)
はとりたくないと思っています。
そこで質問なのですが、
・外部キー制約入れる
これって具体的にどのような制約を入れると実現できるでしょうか?
またDBでの制約が難しい場合、アプリケーション(Rails)で制御することになるのですが、以下のような実装はどう思いますか?
(rollbackが起きるとauto incrementがプラスされるようなのでそれを利用しています。)
ruby
1loop do 2 begin 3 Article.transaction do 4 article = Article.create!(title: ’test’) 5 raise ActiveRecord::Rollback if DeletedArticle.exists?(article_id: article.id) 6 break 7 end 8 rescue 9 next 10 end 11end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/06 07:25
2018/12/06 07:29
2018/12/06 11:55