1

我正在从我的 jdbc 程序中插入一个表,就像这样

PreparedStatement ps = con.prepareStatement(sqlqry);
        ps.setInt(1,dto.getInstall_id());
        ps.setString(2, dto.getDashboard_name());
        ps.setString(3, dto.getDashboard_type());
        ps.setString(4, dto.getDashboard_image());

但是在表中我有一列说D_ID是主键,我不想将D_ID从我的程序插入到表中,因为相同的 id 可能已经存在。所以为了避免 PK_CONSTRAINT 我没有插入它。但是当我尝试这个时,我得到了这个错误。

 ORA-01400: cannot insert NULL into ("TESTDB"."TESTATBLE"."D_ID") 

那么我该如何解决这个问题,如果我从程序中插入 D_ID,我的 JDBC 程序D_ID列应该在表中动态生成 id。我正在为此而努力。请帮忙!

4

2 回答 2

5

您应该使用序列创建该 ID。因此,对于您拥有的每个 ID 列,您创建一个相应的序列:

create table testatble 
(
  d_id integer not null primary key,
  install_id integer not null,
  dashboard_name varchar(100)
  ... more columns ....
);

create sequence seq_testatble_d_id;

你可以像这样使用它:

// note that there is no placeholder for the D_ID column
// the value is taken directly from the sequence
String sqlqry = 
"insert into testatble (d_id, install_id, dashboard_name)  " + 
"values (seq_testatble_d_id.nextval, ?, ?)";

PreparedStatement ps = con.prepareStatement(sqlqry);
ps.setInt(1,dto.getInstall_id());
ps.setString(2, dto.getDashboard_name());
... more parameters ...
ps.executeUpdate();

这样 id 将自动生成。

如果您在插入后需要在您的 Java 代码中生成的 ID,您可以使用getGeneratedKeys()它来返回它:

// the second parameter tells the driver 
// that you want the generated value for the column D_ID
PreparedStatement ps = con.prepareStatement(sqlqry, new String[]{"D_ID"});

// as before
ps.setInt(1,dto.getInstall_id());
ps.setString(2, dto.getDashboard_name());
... more parameters ...
ps.executeUpdate();

// now retrieve the generated ID
int d_id = -1;
ResultSet rs = ps.getGeneratedKeys();
if (rs.next()) // important!
{
   d_id = rs.getInt(1);
}
rs.close();

有关 Oracle 手册中序列的更多信息:http: //docs.oracle.com/cd/E11882_01/server.112/e26088/pseudocolumns002.htm#SQLRF00253

于 2013-11-09T12:31:10.223 回答
1

您应该为 ID 使用自动增量编号(我可以使用序列)。您可以在链接中执行此操作:

在 oracle 上创建具有自动增量的 ID

你也应该阅读这个。如果您的 ID 有序列,那么您可以在此处阅读相关信息。

于 2013-11-09T11:26:54.490 回答