数据库
首页 > 数据库> > java-JDBC SQLite不强制执行唯一主键约束

java-JDBC SQLite不强制执行唯一主键约束

作者:互联网

谁能向我建议为什么我的SQLite JDBC数据库不执行唯一主键约束?

创建表的方法是:

public static void TableCars()
      {
        Connection c = null;
        Statement stmt = null;
        try {
          Class.forName("org.sqlite.JDBC");
          c = DriverManager.getConnection("jdbc:sqlite:WalkerTechCars.db");
          System.out.println("Opened database successfully");

          stmt = c.createStatement();
          String sql = "CREATE TABLE IF NOT EXISTS CARS3 " +
                       "(REGISTRATION TEXT PRIMRY KEY   NOT NULL, " + 
                       " PHONE               TEXT       NOT NULL," +
                       " MAKE                TEXT       NOT NULL, " + 
                       " MODEL               TEXT, " + 
                       " COLOUR              TEXT)";
          stmt.executeUpdate(sql);
          stmt.close();
          c.close();
        } catch ( Exception e ) {
          System.err.println( e.getClass().getName() + ": " + e.getMessage() );
          System.exit(0);
        }
        System.out.println("Cars3 created successfully");
      }

插入方法是:

 public static void InsertCars(String table, String phone, String registration, String make, String model, String colour)
  {
    Connection c = null;
    PreparedStatement pstmt = null;
    try {
      Class.forName("org.sqlite.JDBC");
      c = DriverManager.getConnection("jdbc:sqlite:WalkerTechCars.db");
      c.setAutoCommit(false);
      System.out.println("Opened database successfully");

      String query="INSERT INTO "+table+" (PHONE,REGISTRATION,MAKE, MODEL,COLOUR) VALUES (?,?,?,?,?)";

      pstmt = c.prepareStatement(query);

      pstmt = c.prepareStatement
              ("insert into CARS3 values(?,?,?,?,?)");
        pstmt.setString(1,registration);
        pstmt.setString(2,phone);
        pstmt.setString(3, make);
        pstmt.setString(4, model);
        pstmt.setString(5, colour);         
        pstmt.executeUpdate();

        pstmt.close();
      c.commit();
      c.close();
    } catch ( Exception e ) {
      System.err.println( e.getClass().getName() + ": " + e.getMessage() );
      System.exit(0);
    }
    System.out.println("Car Records created successfully");
  }

不应允许但可以重复执行的代码行是:

DbHandler.InsertCars("Cars3", "1","BN51 MZY", "Mini", "C220", "BLACK");

解决方法:

您的创建SQL会显示PRIMRY KEY而不是PRIMARY KEY.因此,您的表最初是在没有PRIMARY KEY约束的情况下创建的,并且由于您添加了“ IF NOT EXISTS”条件,因此新创建的内容只有在先前删除该表后才会生效.

您可以在列约束图中找到创建没有PRIMARY KEY约束的表的原因:

约束定义错误(PRMARY不是PRIMARY)(用红色表示)使列约束子语法不被触发.

标签:sqlite,eclipse,primary-key,jdbc,java
来源: https://codeday.me/bug/20191029/1957329.html