【问题标题】:Sudden error: org.postgresql.util.PSQLException: ERROR: null value in column "id" violates not-null constraint突发错误:org.postgresql.util.PSQLException:错误:“id”列中的空值违反非空约束
【发布时间】:2025-12-06 04:20:03
【问题描述】:

所以,我有一个将地址数据插入数据库的方法。

    public Address(String street_name, Integer evidenceNumber, Integer describingNumber, Integer PSC, String city, String state) {
    this.streetName = new SimpleStringProperty(street_name);
    this.evidenceNumber = new SimpleIntegerProperty(evidenceNumber);
    this.describingNumber = new SimpleIntegerProperty(describingNumber);
    this.postcode = new SimpleIntegerProperty(PSC);
    this.city = new SimpleStringProperty(city);
    this.state = new SimpleStringProperty(state);
}

....

public boolean addAddress() throws SQLException {
    int controlDuplicate = -1;
    controlDuplicate = findAddress();
    if (controlDuplicate != -1) {
        return false;
    }
    if (this.describingNumber.get() < 0 || this.evidenceNumber.get() < 0 || "".equals(this.city.get()) || "".equals(this.state.get()) || this.postcode.get() < 0) {
        return false;
    }
    //connector.getConn().setAutoCommit(false);
    String addAddress = "INSERT INTO address(street_name, evidence_number, describing_number, postcodes, city, country)"
            + "VALUES('" + this.streetName.get() + "', " + this.evidenceNumber.get() + ", " + this.describingNumber.get() + ", " + this.postcode.get() + ", '" + this.city.get() + "', '" + this.state.get() + "')";
    Statement st = connector.getConn().createStatement();
    try {
        st.executeUpdate(addAddress);
    } catch (PSQLException ex) {
        System.err.println("Insert Address execution unsuccessful!");
        Logger.getLogger(Address.class.getName()).log(Level.SEVERE, null, ex);
        return false;
    }
    st.close();
    return true;
}

一切正常,直到突然,当我再次尝试时,输出是:

org.postgresql.util.PSQLException:错误:“id”列中的空值违反非空约束

有谁知道问题出在哪里?在任何人提问之前,“id”被设置为串行主键,直到最近该方法没有问题。

编辑:最重要的是,似乎所有数据库实体的所有数据都突然丢失了。有人遇到过这种情况吗?

【问题讨论】:

  • 表格丢失了列定义上的“序列”部分,即使用序列的DEFAULT。再仔细看看数据库中的列定义,例如使用 pgAdmin。

标签: java database postgresql


【解决方案1】:

从 pgAdmin 或 psql(with \d table_name) 检查表定义检查 'id' 是否仍然是 serial 。并且 PostgreSQL 在内部为 serial 类型的列创建序列,例如在您的情况下 'address_id_seq' ,请检查此序列是否存在并具有适当的 GRANTS。

【讨论】:

  • 在 Netbeans 中找不到 address_id_seq,似乎每个实体都有相同的问题 + 来自所有 DB 实体的所有数据突然丢失。怎么会这样?
  • 查看数据库模式是否作为部署或应用程序运行的一部分重新创建。检查您是否使用了 Flyway 或 Liquibase 等数据库工具
最近更新 更多