How to drop all NOT NULL constraints from a PostgreSQL table in one go How to drop all NOT NULL constraints from a PostgreSQL table in one go postgresql postgresql

How to drop all NOT NULL constraints from a PostgreSQL table in one go


You can group them all in the same alter statement:

alter table tbl alter col1 drop not null,                alter col2 drop not null,                …

You can also retrieve the list of relevant columns from the catalog, if you feel like writing a do block to generate the needed sql. For instance, something like:

select a.attname  from pg_catalog.pg_attribute a where attrelid = 'tbl'::regclass   and a.attnum > 0   and not a.attisdropped   and a.attnotnull;

(Note that this will include the primary key-related fields too, so you'll want to filter those out.)

If you do this, don't forget to use quote_ident() in the event you ever need to deal with potentially weird characters in column names.


ALTER TABLE table_name ALTER COLUMN [SET NOT NULL| DROP NOT NULL]


If you want to drop all NOT NULL constraints in PostreSQL you can use this function:

CREATE OR REPLACE FUNCTION dropNull(varchar) RETURNS integer AS $$DECLARE  columnName varchar(50);BEGIN    FOR columnName IN  select a.attname  from pg_catalog.pg_attribute a where attrelid = $1::regclass   and a.attnum > 0   and not a.attisdropped   and a.attnotnull and a.attname not in(   SELECT                 pg_attribute.attnameFROM pg_index, pg_class, pg_attribute WHERE   pg_class.oid = $1::regclass AND  indrelid = pg_class.oid AND  pg_attribute.attrelid = pg_class.oid AND   pg_attribute.attnum = any(pg_index.indkey)  AND indisprimary)          LOOP          EXECUTE 'ALTER TABLE ' || $1 ||' ALTER COLUMN '||columnName||' DROP NOT NULL';                END LOOP;    RAISE NOTICE 'Done removing the NOT NULL Constraints for TABLE: %', $1;    RETURN 1;END;$$ LANGUAGE plpgsql;

Please note that the primary keys will be excluded.

Then you can call it using:

SELECT dropNull(TABLENAME);