select * from ways where name LIKE '%Dummy Railway Line%'; で選ばれたnode とwayを全部削除するにはどうしたら良いですか
select * from ways where name LIKE '%Dummy Railway Line%'; で選ばれたnode とwayを全部削除するにはどうしたら良いですか
ways テーブルにおける name 列の内容が '%Dummy Railway Line%' に一致する way と、それに関連する node を削除するには、以下の手順を実行します。ways テーブルと ways_vertices_pgr テーブルのリレーションを考慮した方法です。
手順
1. name 列が空か確認
name 列の値がすべて NULL または予期しない値かもしれません。以下のクエリで name 列の値を確認します。
2. 削除対象の gid を確認
対象となる gid を取得します。もし name が NULL である場合には以下のように NULL 対応を追加してください。
もし上記クエリに結果がない場合、代わりに以下を確認します。
tag_idやrule列など他の列に対象の特徴があるか確認する。- 該当の値を直接確認する(例:
IS NOT NULLを使う)。
3. 関連する node を特定
source や target のノードが ways_vertices_pgr テーブルに存在する場合、それを削除します。
以下のクエリで関連する source と target を確認します。
これにより、削除対象のノード source と target を特定できます。
4. 関連する ways_vertices_pgr の削除
取得した source および target に基づき、ways_vertices_pgr テーブルからノードを削除します。
5. ways テーブルの削除
最後に ways テーブルから該当する行を削除します。
注意事項
- バックアップを作成: データ削除は不可逆操作です。削除前にバックアップを必ず取得してください。
- インデックスを活用: クエリ性能を向上させるため、適切なインデックスがあるか確認します(
ways_pkeyなど)。 - 依存関係: 外部キー制約があるため、削除の順序(ノード懼ウェイ)を守る必要があります。
これにより、name LIKE '%Dummy Railway Line%' に該当するデータを完全に削除できます。
この方法だと関連のあるnodeも消してしまうような気がします。wayだけ消せれば良いのです。
関連のある node を削除せずに、ways テーブルだけから特定の way を削除する場合、以下の手順で進めることができます。
方法
1. 削除対象の gid を確認
name に基づいて削除対象の way の gid を確認します。
2. ways テーブルから対象の行を削除
特定した gid を使って ways テーブルから削除します。関連ノードは削除されません。
外部キー制約について
ways テーブルには外部キー制約が設定されていますが、ways テーブル自体からの削除では関連ノード(source や target)を削除する必要はありません。外部キー制約は、通常、ノードが削除される際に ways のデータが参照整合性を保つようにするためのものです。
この方法であれば、ways_vertices_pgr テーブルやその他の関連ノードはそのまま維持されます。
確認
削除後にデータが正しく削除されたかを確認するには、以下を実行してください。
結果が空であれば、対象の way が正しく削除されています。

コスト付き(hakata_ex_cost_db)とコストなし(hakata_no_dummy_db)の地図を2種類作れました。