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種類作れました。