如何避免将空值插入主键或非空列?
Posted
技术标签:
【中文标题】如何避免将空值插入主键或非空列?【英文标题】:How to avoid inserting null values into Primary key or Not Null columns? 【发布时间】:2013-11-09 11:17:28 【问题描述】:我正在从我的 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。 我正在为此而努力。请帮忙!
【问题讨论】:
你能输入字符串 sqlqry 吗?还有列名 您是否为您的数据库设置了“自动增量”?如果是,则不需要将id插入表中,DB会自动处理。 【参考方案1】:您应该使用序列创建该 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
【讨论】:
非常感谢提供如此简单的解释的有用信息。【参考方案2】:您应该为 ID 使用自动递增编号(我可以使用序列)。您可以在链接中执行此操作:
Create ID with auto increment on oracle
您也应该阅读此内容。如果您的 ID 有序列,那么here 您可以阅读相关信息。
【讨论】:
以上是关于如何避免将空值插入主键或非空列?的主要内容,如果未能解决你的问题,请参考以下文章