duckdb

DuckDB drop column: no column named that way


Why DuckDB tells me there is no column named that way when I try to drop a column?

D DESCRIBE oa_pub;
┌──────────────┬─────────────┬─────────┬─────────┬──────────────────────────┬─────────┐
│ column_name  │ column_type │  null   │   key   │         default          │  extra  │
│   varchar    │   varchar   │ varchar │ varchar │         varchar          │ varchar │
├──────────────┼─────────────┼─────────┼─────────┼──────────────────────────┼─────────┤
│ id           │ INTEGER     │ NO      │ PRI     │ nextval('oa_pub_id_seq') │ NULL    │
│ project_id   │ INTEGER     │ NO      │ UNI     │ NULL                     │ NULL    │
│ oa_author_id │ VARCHAR     │ NO      │ UNI     │ NULL                     │ NULL    │
│ oa_pub_id    │ VARCHAR     │ NO      │ UNI     │ NULL                     │ NULL    │
│ oa_pub_json  │ JSON        │ YES     │ NULL    │ NULL                     │ NULL    │
│ oa_pub_id_2  │ VARCHAR     │ YES     │ NULL    │ NULL                     │ NULL    │
└──────────────┴─────────────┴─────────┴─────────┴──────────────────────────┴─────────┘
D ALTER TABLE oa_pub DROP COLUMN oa_pub_id;
Catalog Error:
table "oa_pub" does not have a column named oa_pub_id

Solution

  • Although the error message is cryptic, the problem was that oa_pub_id is part of a unique constraint. See the key column of the table returned by DESCRIBE.

    To reproduce:

    D CREATE TABLE test2 (id INT PRIMARY KEY, name TEXT, surname TEXT, age INT, UNIQUE(surname, age));
    D DESCRIBE test2;
    ┌─────────────┬─────────────┬─────────┬─────────┬─────────┬─────────┐
    │ column_name │ column_type │  null   │   key   │ default │  extra  │
    │   varchar   │   varchar   │ varchar │ varchar │ varchar │ varchar │
    ├─────────────┼─────────────┼─────────┼─────────┼─────────┼─────────┤
    │ id          │ INTEGER     │ NO      │ PRI     │ NULL    │ NULL    │
    │ name        │ VARCHAR     │ YES     │ NULL    │ NULL    │ NULL    │
    │ surname     │ VARCHAR     │ YES     │ UNI     │ NULL    │ NULL    │
    │ age         │ INTEGER     │ YES     │ UNI     │ NULL    │ NULL    │
    └─────────────┴─────────────┴─────────┴─────────┴─────────┴─────────┘
    D ALTER TABLE test2 DROP COLUMN surname;
    Catalog Error:
    table "test2" does not have a column named "surname"