如何通过一个PostgreSQL 9.1

时间:2016-02-25 12:27:27

标签: postgresql plpgsql

我将我的数据从MySQL数据库迁移到PostgreSQL数据库,并且错误地认为我在PostgreSQL数据库中的所有列都设置为非空。

在此之后我面临插入数据的问题,并且必须手动取消选中非空,所以有任何方法可以对表中的所有列进行操作(除了id(PRIMARY KEY))。

我也有单列查询,但也很费时,

ALTER TABLE <table name> ALTER COLUMN <column name> DROP NOT NULL;

2 个答案:

答案 0 :(得分:1)

我认为没有内置的功能。但是编写一个函数来实现这一点很容易。例如:

CREATE OR REPLACE FUNCTION set_nullable(relation TEXT)
RETURNS VOID AS
$$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN (SELECT * FROM pg_attribute
                WHERE attnotnull = TRUE AND attrelid=relation::regclass::oid AND attnum > 0 AND attname != 'id')
    LOOP
        EXECUTE format('ALTER TABLE %s ALTER COLUMN %s DROP NOT NULL', relation, rec.attname);
        RAISE NOTICE 'Set %.% nullable', relation, rec.attname;
    END LOOP;
END
$$
LANGUAGE plpgsql;

像这样使用:

SELECT set_nullable('my_table');

答案 1 :(得分:0)

只需使用与当前表相同的结构执行新的CREATE TABLE noNULL,然后修改所需的NULLable字段。

然后从旧表中插入

INSERT INTO noNULL 
      SELECT *
      FROM oldTable

然后删除oldTable并重命名noNull -> oldTable