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
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!
Reference
この問題について(Elixir今日:PostgreSQLの重複行を削除する), 我々は、より多くの情報をここで見つけました https://dev.to/paugramming/elixir-today-remove-duplicate-rows-in-postgresql-using-ecto-4embテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol