当前位置: 首页 > 知识库问答 >
问题:

如何在JDBC sql中自动增加主键

欧阳山
2023-03-14

你们能帮帮我吗,我的主键无法自动递增,我的表名是books,我想自动递增的列是serial_no,这是主键。

public class donate extends javax.swing.JFrame {
    Connection con;
    Statement stmt;
    ResultSet rs;
    PreparedStatement pst;
    DefaultTableModel loginModel = new DefaultTableModel();
    int curRow = 0;

/**
 * Creates new form donate
 */
public donate() {
    initComponents();
    DoConnect();        
    showAll();
}
void showAll(){
   try{
   rs = stmt.executeQuery("SELECT * FROM books");
   while(rs.next())
   {
       String book = rs.getString("book_title");
       String categorie = rs.getString("category");
       String status = rs.getString("book_status");
       String donators = rs.getString("donator");
       int serial_nos = rs.getInt("serial_no");
       loginModel.addRow(new Object[]{book, categorie, status, donators, serial_nos});
   }
   }catch(SQLException err){
        System.out.println(err);
   }
}
void DoConnect( ) {
               try{
                //CONNECT TO THE DATABASE
                String host = "jdbc:derby://localhost:1527/Dafuq7";
                String uName ="Dafuq7";
                String uPass ="Dafuq7";
                con = DriverManager.getConnection(host, uName, uPass);

                //EXECUTE SOME SQL AND LOAD THE RECORDS INTO THE RESULTSET
                        stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
                    ResultSet.CONCUR_UPDATABLE);
                String sql = "SELECT * FROM books";
                rs = stmt.executeQuery(sql);
        }   
    catch(SQLException err){
                JOptionPane.showMessageDialog(donate.this, err.getMessage());
    }
}

这是五月按钮,当我输入所有数据时,它将被提交到我的台本上

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    String bookttl = bookt.getText();
    String yourn = yn.getText();
    String categ = cat.getSelectedItem().toString();
    String bstat = bs.getSelectedItem().toString();

    try {
        rs.moveToInsertRow();
        rs.updateString( "book_title", bookttl );
        rs.updateString( "category", yourn );
        rs.updateString( "book_status", categ );
        rs.updateString( "donator", bstat );




        loginModel.addRow(new Object[]{bookttl, yourn, categ, bstat});

        rs.insertRow( );
        stmt.close();
        rs.close();

        stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
        String sql = "SELECT * FROM books";
        rs = stmt.executeQuery(sql);

    }
    catch (SQLException err) {
        System.out.println(err.getMessage() );
    }// TODO add your handling code here:
}

顺便说一句,我找到了另一种方法,抓取我的表并重建它,然后将代码放入create table脚本中

SERIAL_NOINTEGER默认AUTOINCREment:开始1增量1不是空主键

共有1个答案

夏祺然
2023-03-14

只需将您的serial_no列定义为int主键生成始终作为标识,然后Derby将自动为您分配数字。下面是一些示例代码:

public static void main(String[] args) {
    try (Connection conn = DriverManager.getConnection(
                "jdbc:derby:C:/__tmp/derbytest;create=true")) {
        String sql;
        sql = "DROP TABLE books";
        try (Statement s = conn.createStatement()) {
            s.executeUpdate(sql);
        } catch (Exception e) {
            // assume table did not previously exist
        }
        sql = "CREATE TABLE books (" +
                "serial_no int primary key " +
                    "generated always as identity, " +
                "title varchar(100))";
        try (Statement s = conn.createStatement()) {
            s.executeUpdate(sql);
        }
        sql = "INSERT INTO books (title) VALUES (?)";
        try (PreparedStatement ps = conn.prepareStatement(sql)) {
            ps.setString(1, "The Book of Foo");
            ps.executeUpdate();
            ps.setString(1, "The Book of Bar");
            ps.executeUpdate();
            ps.setString(1, "The Book of Baz");
            ps.executeUpdate();
        }
        sql = "SELECT * FROM books";
        try (Statement s = conn.createStatement()) {
            try (ResultSet rs = s.executeQuery(sql)) {
                while (rs.next()) {
                    System.out.println(String.format(
                            "%d: %s", 
                            rs.getInt("serial_no"),
                            rs.getString("title")));
                }
            }
        }            
    } catch (SQLException se) {
        se.printStackTrace(System.out);
        System.exit(0);
    }
}

从而产生

1: The Book of Foo
2: The Book of Bar
3: The Book of Baz
 类似资料:
  • 问题内容: 就像在MYSQL中一样,我想要一个递增的ID。 问题答案: MongoDB旨在进行水平扩展。在这种情况下,自动递增将导致id冲突。这就是为什么id看起来更像guid / uuid的原因。

  • 问题内容: 如何从Android客户端自动递增存储在Firebase中的值? 当前:我声明。当我增加时,我看到值2、3等被存储。很好,但是当我重新运行项目时,再次设置为等于1。 我希望它的行为像静态变量一样,因此我可以创建一个从1到无穷大的id,而无需重置。 更新失败 我使用以下代码将Firebase参考和一个字符串传递给函数incrementCounter。 现在,我尝试在oncomplete方

  • 问题内容: 想知道是否存在将新记录插入启用了主键的表中的简写版本?(即不必在查询中包括关键字列)假设关键字列称为ID,其他列为Fname,Lname和Website 问题答案: 使用DEFAULT关键字: 另外,您可以指定列(这是更好的做法): 参考: http://dev.mysql.com/doc/refman/5.6/zh-CN/data-type-defaults.html

  • 问题内容: 我有2个表order_retailer和order_customer 他们都有自动递增的主键order_id 为了使订单ID在整个系统中保持唯一,我希望order_retailer仅将ID作为偶数编号,对于order_customer而言,这些ID为奇数。为此,我必须将autoincrement的增量值设置为2。是否可以在mysql中将其设置为明智的表。 我不要PHP解决方案。请让我知

  • 问题内容: 我正在使用Hibernate访问MySQL,并且有一个带有自动递增主键的表。 每次我在表中插入一行时,都不需要指定主键。但是,在插入新行之后,如何立即使用hibernate获取相对主键? 或者我可以只使用jdbc来做到这一点? 问题答案: 保存hibernate实体时,将为您填充该属性。所以如果你有 实际上,我几乎总是在测试中对持久实体的ID进行一次操作,以确保保存有效。

  • 问题内容: 我正在将我的mysql db表从id(自动)更改为uid。 这是我得到的错误。 据我了解,我需要将ID更改为非自动增量,因为我将其作为主键了。更改列以删除主键和自动递增的语法是什么? 问题答案: 如果您需要在单个SQL语句中从列中删除自动增量和主键,则应该这样做: 实际上,您应该能够在单个查询中完成所有操作: