sql >> データベース >  >> RDS >> PostgreSQL

列を削除しても列参照が完全に削除されるわけではありません-postgresql

    pg_attributeをいじらないでください 直接。そうしている場合は、おそらくバックアップから復元するときです。

    列が削除されると、PostgreSQLは実際にはその列を削除しませんが、名前を変更して削除済みとしてマークします。

    CREATE TABLE testtab (
       id integer PRIMARY KEY,
       dropme text NOT NULL,
       val text NOT NULL
    );
    
    ALTER TABLE testtab DROP dropme;
    
    SELECT attname, attnum, attisdropped
    FROM pg_attribute
    WHERE attrelid = 'testtab'::regclass
       AND attnum > 0
    ORDER BY attnum;
    
    ┌──────────────────────────────┬────────┬──────────────┐
    │           attname            │ attnum │ attisdropped │
    ├──────────────────────────────┼────────┼──────────────┤
    │ id                           │      1 │ f            │
    │ ........pg.dropped.2........ │      2 │ t            │
    │ val                          │      3 │ f            │
    └──────────────────────────────┴────────┴──────────────┘
    (3 rows)
    

    したがって、削除された列はまだ列の制限にカウントされると思います。

    私はそれを取り除くための1つの、あまり快適ではない方法を考えることができます:

    BEGIN;
    CREATE TABLE testtab_2 (LIKE testtab INCLUDING ALL);
    INSERT INTO testtab_2 SELECT * FROM testtab;
    DROP TABLE testtab;
    ALTER TABLE testtab_2 RENAME TO testtab;
    COMMIT;
    


    1. pysparkシェルでjdbcを使用してpostgresに接続できません

    2. Linux上のDelphiをSQLServerに接続する

    3. 一重引用符を回避する衛生状態は、SQL ServerのSQLインジェクションによってどのように打ち負かされますか?

    4. 50以上の列名を入力せずに同じテーブルの行をコピーする(2つの列を変更する場合)