sqlpostgresqlfile-iopostgresql-copy

Delete rows of a table specified in a text file in Postgres


I have a text file containing the row numbers of the rows that should be deleted in my table like this:

3
32
40
55
[...]

How can I get a PostgreSQL compatible SQL statement which deletes each of these rows from my table using the text file?


Solution

  • Doing it once could look like this:

    CREATE TEMP TABLE tmp_x (nr int);
    
    COPY tmp_x FROM '/absolute/path/to/file';
    
    DELETE FROM mytable d
    USING  tmp_x
    WHERE  d.mycol = tmp_x.nr;
    
    DROP TABLE tmp_x;  -- optional
    

    Or use the psql meta-command \copy. The manual:

    COPY naming a file or command is only allowed to database superusers or users who are granted one of the roles pg_read_server_files, pg_write_server_files, or pg_execute_server_program, since it allows reading or writing any file or running a program that the server has privileges to access.

    Do not confuse COPY with the psql instruction \copy. \copy invokes COPY FROM STDIN or COPY TO STDOUT, and then fetches/stores the data in a file accessible to the psql client. Thus, file accessibility and access rights depend on the client rather than the server when \copy is used.

    For repeated use, wrap it into a PL/pgSQL function with file-path / table name / column name as parameters. If any identifiers are dynamic you must use EXECUTE for the DELETE.

    If you work with \copy, you have to do that in psql in the same session before executing SQL commands (possibly wrapped in a server-side function).