Elixir今日:PostgreSQLの重複行を削除する


イントロ


このチュートリアルでは、ECTOを使用してスキーマで重複行を削除する方法を説明します.

準備

  • スキーママイグレーションで、このスキーマ設定を行ってください.
  • CREATE TABLE(:student_teacher, primary_key: false) do
    
         add :id, :uuid, primary_key: true
         add :student_id, references(:students, type: :uuid)
         add :teacher_id, references(:teachers, type: :uuid)
    
    end
    
  • そして、2、3の重複した記録を挿入しましょう.(あなたのデータのモックアップにはEx.Machinaを使用していると思われます)
  • student = insert(:student)
    teacher = insert(:teacher)
    insert_list(100, :student_teacher, student: student, teacher: teacher)
    

    を使用して重複行をチェック


    コンソールでiex -S mixを実行し、重複する行を確認します.
    iex) query = SELECT COUNT(*), student_id, teacher_id FROM 
    student_teacher group by student_id, teacher_id having count(*) > 1;
    
    iex) Ecto.Adapter.SQL.query!(Repo, query)
    
    iex) %Postgrex.Result{
      columns: ["count", "student_id", "teacher_id"],
      command: :select
      num_rows: 1,
      rows: [
        [
          100,
          <<student_id>>,
          <<teacher_id>>
        ],
    
      ]
    }
    
    

    行を削除するクエリを実行する


    Repo.transaction(
          fn ->
            query = """
            DELETE FROM student_teacher s1
            USING student_teacher s2
            where s1.id < s2.id
            AND s1.student_id = s2.student_id
            AND s1.teacher_id = s2.teacher_id
            """
    
            Ecto.Adapters.SQL.query!(Repo, query)
          end,
          timeout: :infinity
        )
    
    

    Happy Coding!