【问题标题】:How to Insert auto increment primary key into database table如何将自增主键插入数据库表
【发布时间】:2014-10-03 11:22:33
【问题描述】:

我正在插入使用JFileChooser 选择的CSV 文件。导入时出现错误,它显示主键IS NULL。它是自动增量的(我使用了 SQL 命令)。奇怪的是,完全相同的插入代码适用于同一数据库中的不同表。这是我到目前为止的代码:

JAVA 代码

    int returnVal = fileChooser.showOpenDialog(this);
             if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fileChooser.getSelectedFile();
                try {
                Scanner sin = new Scanner(new FileReader(new File(file.getName())));
                while (sin.hasNext()) {

                    String[] line = sin.nextLine().split(",");
                    String name = line[0];
                    String surname = line[1];
                    int age = Integer.parseInt(line[2]);
                    String gender = line[3];
                    String shoeSize = line[4];

                    Studentstbl st = new Studentstbl();
                    st.setAge(age);
                    st.setDonationStatus("N");
                    st.setFirstName(name);
                    st.setGender(gender);
                    st.setShoeSize(shoeSize);
                    st.setSurname(surname);

                        yritpatPUEntityManager.getTransaction().begin();
                        yritpatPUEntityManager.persist(st);
                        yritpatPUEntityManager.getTransaction().commit();
                        studentstblList.clear();
                        studentstblList.addAll(studentstblQuery.getResultList());
                }
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(jPanel1, "A problem occured when         accessing the file "+file.getAbsolutePath(), "Error", JOptionPane.ERROR_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(jPanel1, "Cancelled by user", "Error",         JOptionPane.ERROR_MESSAGE);
}

SQL

    create table studentstbl (
    student_id int not null primary key
      GENERATED ALWAYS AS IDENTITY
      (START WITH 1, INCREMENT BY 1),
    school_id int not null,
    first_name varchar(60) not null,
    surname varchar(60) not null,
    age int not null,
    gender varchar(1) not null,
    shoe_size int not null,
    donation_status varchar(1) not null)

和

    ALTER TABLE STUDENTSTBL
    ADD CONSTRAINT SCHOOL_ID FOREIGN KEY (SCHOOL_ID)
    REFERENCES SCHOOLSTBL
    (SCHOOL_ID)

CSV

    aname,asname,2,M,1
    bname,bsname,3,F,1
    cname,csname,4,F,2
    dname,dsname,5,F,3
    ename,esname,7,M,3
    fname,fsname,6,M,3
    gname,gsname,8,F,4
    hname,hsname,10,M,4
    iname,isname,9,M,4
    jname,jsname,14,F,7
    kname,ksname,12,F,6
    lname,lsname,13,F,6
    mname,msname,3,F,1
    nname,nsname,2,M,1
    oname,osname,15,F,6
    pname,psname,15,M,6
    qname,qsname,12,M,4
    rname,rsname,8,M,3
    sname,ssname,7,M,3
    tname,tsname,6,F,3
    uname,usname,5,F,2
    vname,vsname,14,M,6
    wname,wsname,12,M,6
    xname,xsname,6,F,2
    yname,ysname,8,M,2
    zname,zsname,7,M,2

【问题讨论】:

  • Studentstbl 实体的代码在哪里(顺便说一句,它的名字很糟糕。Student 有什么问题?)?另外,为什么要为文件的每一行开始一个新事务?
  • 我知道,我们学校有一个用于测试目的的标准命名约定。宁愿坚持下去,直到我出去
  • "你为什么要为文件的每一行开始一个新事务?" - 我是学生,还在学习这些东西。有没有更有效的方法?
  • 是的:除非文件真的很大(读取:数百万行),否则单个事务会更快。阅读docs.jboss.org/hibernate/core/4.3/manual/en-US/html_single/…

标签: java sql insert primary-key auto-increment


【解决方案1】:

我今天在学校修好了!我在 Studenttbl 中硬编码了一个 .get 语句,它修复了我的其他错误之一并导致了这个错误。删除实体、列表和查询并再次导入它们完美无缺。

【讨论】:

    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 2012-02-03
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多