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

如何在DB2中向主键插入空值?

呼延德华
2023-03-14

下面是创建表的脚本:

CREATE TABLE corr.CORRESPONDENCE  (
this is the specified col---->CORR_ID BIGINT NOT NULL,
    CORR_NAME VARCHAR(255) NOT NULL,
    CORR_NO VARCHAR(255),
    CREATE_DATE_TIME TIMESTAMP NOT NULL,
    DELIVERY_DATE_TIME DATE,
    NO_OF_ATTACH INTEGER,
    SITE_ID VARCHAR(20),
    DELIVERY_ID VARCHAR(20),
    CREATE_USER BIGINT NOT NULL,
    SECURITY_ID BIGINT,
    DELIVERY_BY VARCHAR(20),
    WORKFLOW_ID BIGINT
)
DATA CAPTURE NONE ;

ALTER TABLE corr.correspondence ADD CONSTRAINT u143_159 PRIMARY KEY 
(corr_id)  ;

共有1个答案

华欣怡
2023-03-14

Informix的哪个版本?表的模式是什么?INSERT语句是什么?您使用哪些API访问Informix?客户端代码在哪个平台上运行?数据库服务器在哪个平台上运行?

我不相信可以在Informix中向类似串行的列中插入空值。您的表上有主键约束,还是只有一个没有NOT NULL且没有主键约束的SERIAL8列?不能将NULL直接插入到SERIAL8列中(根据推断,也不能将NULL直接插入到SERIAL或BIGSERIAL列中)。

演示(使用RHEL 5 Linux x86/64上的Informix 11.70.fc6开发版本;客户机基于ESQL/C,客户机和服务器都在同一台机器上):

SQL[1910]: begin;
SQL[1911]: create table t1(s8 serial8 not null, v1 char(8) not null);
SQL[1912]: insert into t1(s8, v1) values(null, "works?");
SQL -391: Cannot insert a null into column (t1.s8).
SQLSTATE: 23000 at /dev/stdin:6
SQL[1913]: rollback;
SQL[1914]: begin;
SQL[1915]: create table t1(s8 serial8 primary key, v1 char(8) not null);
SQL[1916]: insert into t1(s8, v1) values(null, "works?");
SQL -703: Primary key on table (t1) has a field with a null key value.
SQLSTATE: IX000 at <<temp>>:2
SQL[1917]: rollback;
SQL[1918]: create table t1(s8 serial8, v1 char(8) not null);
SQL[1919]: insert into t1(s8, v1) values(null, "works?");
SQL -391: Cannot insert a null into column (t1.s8).
SQLSTATE: 23000 at <<temp>>:2
SQL[1920]: drop table t1;
SQL[1921]:

弗兰克电脑评论道:

奇怪的是,我的印象是,当将数据加载到带有串行列的表中时,如果我没有为串行列提供值,它会在插入期间将NULL转换为零,就像加载的数据包含零一样?

另外,在ISQL PERVER中,当我在包含串行列的表中插入新行时,我不会为串行列提供值,但是PERVER显示一个零(0)并且在单击Escape之后,它会将其转换为下一个最高的INT值!

使用ISQL,Perform在数据输入期间显式地强制0并报告插入的值;同样,客户端代码可以防止错误。

这就是为什么知道用什么来演示问题或特性是很重要的。现在我必须使用DB-Access制作一个LOAD和NULL演示...我不认为我的SQLCMD程序在LOAD期间修复了串行列的NULL(或者,如果它修复了,我很久以前就进行了这个黑客攻击)。

测试DB-Access(这次来自Mac OS X 10.7.4上的IDS 11.70.fc2),使用:

|data for row 1|1|
|data for row 2|2|
BEGIN;
CREATE TABLE load_null(s8 SERIAL8 PRIMARY KEY, v32 VARCHAR(32) NOT NULL, i INTEGER NOT NULL);
LOAD FROM "xx.unl" INSERT INTO load_null;
ROLLBACK;
$ dbaccess stores xx

Database selected.


Started transaction.


Table created.


  703: Primary key on table (load_null) has a field with a null key value.

  847: Error in load file line 1.
Error in line 3
Near character position 41

Transaction rolled back.


Database closed.

$

对于使用Informix可以将空值插入主键列的说法,我比以往任何时候都更加不相信。

虽然我知道LOAD不是Informix SQL本机语句,但我假定它已添加到SE(标准引擎)和OL(联机)引擎中?

没有;LOAD语句由客户端程序中的代码处理:DB-Access、ISQL、I4GL、DB-Load、db-import。在每种情况下,客户机都会识别和解析语句,将其转换为准备好的合适的INSERT语句,然后客户机读取和解析数据文件,并将html" target="_blank">数据一次一行地发送到服务器(逻辑上;实际上,涉及到一个INSERT游标,它为您提供了对插入的批处理操作)。

否:LOAD语句不涉及DB-Load,也不涉及ON-LOAD。

SQLCMD的源代码是否可用?如果是,我可以转储dbaccess并用sqlcmd的剥离版本替换它吗?

是的。它可以从IIUG(International Informix User Group)软件存档中获得。那里提供的版本(87.02)接近当前版本(我使用的是87.06,但我还没有完全准备好向世界其他地方发布它,当它发布时将是88.00)。我在Windows上不支持它,只是因为我发现Windows是一个太敌对的开发环境。不过,它有时会在Windows上工作。当我发现Microsoft发布“安全C库”例程时,我的最后一次尝试停止了,但它们提供的例程与标准TR27341中的例程不一样。在那一点上我又放弃了。

 类似资料:
  • 问题内容: 我将主键设置为自动递增。 我正在执行多个查询,我需要检索该主键值以用作另一个表()中的外键。 当我执行插入查询时,是否有任何优雅的方法来获取主键值?现在,我正在重新查询并获得该列中的最高价值,这似乎真的很棘手。 有什么建议? 问题答案: 通过scope_identity()获得新的PK

  • 问题内容: 如何找到表的主键列名称和值?我尝试在SYSCAT表中查找,但是找不到任何内容。 问题答案: 这应该可以满足您在大型机上的需求: http://publibz.boulder.ibm.com/cgi- bin/bookmgr_OS390/BOOKS/DSNSQH11/E.8?DT=20010718164132 DB2 10 Z / OS: 功能: http://www.ibm.com/s

  • 我正在尝试更新 DB2 中的同一表中是否存在(如果不存在)或插入。 我有一个表“V _ OPORNAC”(scheme是SQLDBA),它包含三列,其中有两个主键:IDESTE (PK)、IDEPOZ (PK)、OPONAR 我的情况是,如果IDESTE=123456和IDEPOZ=0的数据(OPONAR)不存在,则插入新行,如果存在,则更新(OPONAR)。我试过这样做: 执行上面的代码,我得到

  • 所以,我有一个Oracle数据库(在APEX中),其中有一个名为“Scheme”的列。 如下所示: 现在,我所有的表都是这样设置的,并且工作得很好,但是当我尝试在我的方案上插入时,它表示我正在尝试在主键方案ID中插入null。 我将向您展示我使用的两个SQL插入。一个是私人教练,另一个是该计划。 Peronal_Trainer有一个Personal_Trainer_ID作为主键,完全像方案一样设置