【问题标题】:cannot set null to a unique column不能将 null 设置为唯一列
【发布时间】:2021-12-03 04:12:57
【问题描述】:

这是我的桌子

CREATE TABLE "client" (
"id"    INTEGER,
"name"  TEXT COLLATE NOCASE,
"surname"   TEXT COLLATE NOCASE,
"number"    TEXT UNIQUE COLLATE NOCASE,
"car_brand" TEXT,
"modele"    TEXT,
"phone_nbr" TEXT,
PRIMARY KEY("id" AUTOINCREMENT));

当我从我的 java 应用程序添加一个新语句时,我只能向列号添加一次 NULL,但我可以从 db 浏览器添加许多空值 这是我使用的代码

String number = tf_number.getText();
      if(tf_number.getText().trim().isEmpty())
          number = null;
    String name = tf_name.getText();
    String surname = tf_surname.getText();
    String phoneNbr = tf_phoneNbr.getText();
    String car_brand = tf_brand.getText();
    String modele = tf_modele.getText();
    Client c = new Client(name, surname, number, car_brand, modele, phoneNbr);
    ClientCRUD pcd = new ClientCRUD();
    pcd.addClient(p);

这是sql错误

[SQLITE_CONSTRAINT_UNIQUE] UNIQUE 约束失败(UNIQUE 约束失败:client.number)

这是 addClient() 函数

public void addClient(Client t) {
try {
        
    String requete = "INSERT INTO CLIENT(name,surname,number,car_brand,MODELE,phone_nbr)"
    + "VALUES ('"+t.getClientName()+"','"+t.getClientSurname()+"','"+t.getNumber()+"',"
            + "'"+t.getCarBrand()+"','"+t.getModele()+"','"+t.getPhone()+"')";
    Statement st = MyConnection.getInstance().getCnx()
                .createStatement();

        st.executeUpdate(requete);
        System.out.println("Client added");
        
    } catch (SQLException ex) {
        System.out.println(ex.getMessage());
    }
    }

有什么办法吗?

【问题讨论】:

  • 我猜你正在使用 SQLite 数据库,因为 SQLite 现在允许 Unique 字段为空值。但 MySQL 确实支持唯一字段的空值。
  • @ShofiullahBabor 我正在使用 SQLITE
  • 这就是为什么你不能这样做
  • 贴出 addClient() 方法的代码。
  • @ShofiullahBabor 你能解释更多吗?

标签: java sqlite jdbc null unique-constraint


【解决方案1】:
 public void save(Person person) {
    String query = "INSERT INTO person_info (" +
            " name_p, " +
            " age, " +
            " address, " +
            " email " +
            ")" +
            "VALUES(?, ?, ?, ?)";

    try(Connection connection = dbConnection.getConnection()) {
        PreparedStatement prepStatement = connection.prepareStatement(query);

        prepStatement.setString(1, person.getName());
        prepStatement.setInt(2, person.getAge());
        prepStatement.setString(3, person.getAddress());
        prepStatement.setString(4, null);

        prepStatement.execute();
    }
    catch (SQLException e){
        e.printStackTrace();
    }
}

##这会解决你的问题

【讨论】:

  • @Shofiullah,感谢您提供完整的示例!
  • 谢谢!现在可以了
  • prepStatement.setString(4, null); - 这不会导致非空值丢失吗?
【解决方案2】:

您的代码插入字符串“null”,而不是像浏览器那样插入真正的 null。 因此,该唯一列中只能有 1 个值为“null”的字符串。

您可以使用带参数的preparedStatement 来代替您使用的语句。 例如:

PreparedStatement preparedStatement = connection.prepareStatement(sql))

这回答了如何使用准备好的语句插入 null:Insert null using prepared statement

你的查询的 sql 字符串应该有参数。 查看更多关于准备好的语句:Prepared Statements Tutorial

【讨论】:

  • 是的,也许!知道如何插入真正的 null 吗?
  • 查看我提到的教程。
  • 我会检查并告诉你结果,谢谢!
  • 我添加了对另一个关于如何使用准备好的语句插入空值的答案的引用。
猜你喜欢
  • 2018-05-04
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 2022-12-01
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多