如何避免将空值插入主键或非空列?

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 您可以阅读相关信息。

【讨论】:

以上是关于如何避免将空值插入主键或非空列?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据另一列的值创建空列或非空列?

数据库中创建表(包括创建主键,外键,非空列,唯一)

ALTER TABLE,在非空列中设置空,PostgreSQL 9.1

Scala DataFrame,将非空列的值复制到新列中

在一列中获取火花数据帧的所有非空列

选择 PL/SQL 中两个非空列值之间的行集