创建外键时出现DB2SQL错误-104

创建外键时出现DB2SQL错误-104,sql,database,db2,temp-tables,Sql,Database,Db2,Temp Tables,我试图创建临时表来进行一些测试,但遇到了以下错误: [DECLARE - 0 row(s), 0.000 secs] [Error Code: -104, SQL State: 42601] DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=key;( id int primary;<references_spec>, DRIVER=3.50.152 如果我删除约束部分,它将正常执行。我尝试了引用session.comp

我试图创建临时表来进行一些测试,但遇到了以下错误:

[DECLARE - 0 row(s), 0.000 secs]  [Error Code: -104, SQL State: 42601]  DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=key;(
id int primary;<references_spec>, DRIVER=3.50.152
如果我删除
约束
部分,它将正常执行。我尝试了
引用session.company(id\u comp)
引用session.company.id\u comp
,结果相同

我怎样才能解决这个问题

提前谢谢

更新:

这可能被认为是一个不同的问题,但是,有人建议我在
会话中生成
id\u comp
作为
主键
。company
,我也不能这样做

我尝试在一个新脚本中创建一个带有
主键
的表,这个简单的表(如您所见,我尝试在逗号后使用
主键
约束:

declare global temporary table session.t1 (
    id int primary key generated always as identity (start with 0 increment by 1) -- ,
    -- primary key (id)
    ) with replace on commit preserve rows not logged;
还尝试了所有这些不同的选项:

primary key id int generated always as identity (start with 0 increment by 1)
---
primary key (id) int
---
primary key id int
---
id int,
primary key (id)

如果您的Db2服务器运行在Linux/Unix/Windows上,则DGTT不能参与声明性RI。请参阅以下文本中的文档:

声明的临时表的使用限制:声明的临时表不能:。。 可以在引用约束(SQLSTATE 42995)中指定

但是,您可以使用编程的RI(也就是说,根据您的数据模型和业务需要,通过使用set null或delete手动强制执行完整性)。这意味着您的代码必须填充这两个表,然后使用普通SQL相应地编程RI检查和结果操作(设置null或删除行)

您应该清楚地解释为什么不需要持久表,以便了解动机——然后您可能会得到更好的解决方案

您可以在事务级别使用具有“notlogged”特性的持久表,但这不是一个好主意,因为在发生任何Db2错误后,您必须删除/重新创建持久表

如果您不需要DGTT(会话表),并且愿意使用持久表,那么下面的示例语法对LUW上的Db2当前版本有效:

create table company (
    id_comp int not null generated always as identity (start with 0 increment by 1) constraint pk1 primary key,
    name_comp varchar(60)
    ) ;


create table xemployee (
    id_emp int not null generated always as identity (start with 0 increment by 1),
    name varchar(40),
    id_comp int,
        constraint fk_id_comp
            foreign key (id_comp)
            references company (id_comp)
            on delete cascade
    ) ;

如果您的Db2服务器在Linux/Unix/Windows上运行,则DGTT不能参与声明性RI。请参阅本文中的文档:

声明的临时表的使用限制:声明的临时表不能:。。 可以在引用约束(SQLSTATE 42995)中指定

但是,您可以使用编程的RI(也就是说,根据您的数据模型和业务需要,通过使用set null或delete手动强制执行完整性)。这意味着您的代码必须填充这两个表,然后使用普通SQL相应地编程RI检查和结果操作(设置null或删除行)

您应该清楚地解释为什么不需要持久表,以便了解动机——然后您可能会得到更好的解决方案

您可以在事务级别使用具有“notlogged”特性的持久表,但这不是一个好主意,因为在发生任何Db2错误后,您必须删除/重新创建持久表

如果您不需要DGTT(会话表),并且愿意使用持久表,那么下面的示例语法对LUW上的Db2当前版本有效:

create table company (
    id_comp int not null generated always as identity (start with 0 increment by 1) constraint pk1 primary key,
    name_comp varchar(60)
    ) ;


create table xemployee (
    id_emp int not null generated always as identity (start with 0 increment by 1),
    name varchar(40),
    id_comp int,
        constraint fk_id_comp
            foreign key (id_comp)
            references company (id_comp)
            on delete cascade
    ) ;

表session.company中的列id\u comp必须是主键。@etsa不是作为标识生成的
不为null
等同于
主键
?顺便说一下,我尝试使用DB2文档中看到的
主键,但我运气不好。您能用正确的语法发布一个答案吗?谢谢您能发布sc吗cript您添加了主键?@etsa我更新了问题。table session.company中的列id\u comp必须是主键。@etsa不是
不为null,总是作为等同于
主键
的标识生成的。顺便说一句,我试着使用了DB2文档中看到的
主键
,但我运气不好。您能用正确的语法回答?谢谢你能发布你添加主键的脚本吗?@etsa我更新了问题。这些表根本不需要是DGTT。它们只是不能持久。你能提供一个替代方案吗?谢谢它们不能持久,因为这是一个公司环境,我的DB用户没有权限。我已经有了在本地安装DB2是为了进行我的此类测试。非常感谢您的回答。所有这些表都不需要是DGTT。它们不能是持久的。您能提供一个替代方案吗?谢谢,它们不能是持久的,因为这是一个公司环境,我的DB用户没有权限。我已经在本地安装了DB2为了做我的这种测试。非常感谢你的回答