DB2:尝试在交叉表中引用自动生成的字段

Posted

技术标签:

【中文标题】DB2:尝试在交叉表中引用自动生成的字段【英文标题】:DB2: Attempting to reference Auto Generated Fields within Intersection Tables 【发布时间】:2015-04-24 17:53:34 【问题描述】:

我正在使用 DB2 尝试创建一个小型库存系统的项目。目前,我和我的团队正在寻找我们在创建带有自动生成字段的表时遇到的障碍的答案。我提供了一个示例 create 语句,让您了解我们正在处理的内容:

“创建表清单 ( PRODUCT_ID INT NOT NULL 始终作为标识生成(以 1 递增 1 最小值 1 无最大值 无循环 无缓存顺序), PRODUCT_NAME CHAR(100) 非空, 描述 CHAR(100), UNIT_PRICE DECIMAL(6 , 2), 数量整数 ) 数据捕获无;

我们遇到的问题是当我们将测试数据插入数据库时​​(运行 ddl 时没有错误;插入时测试数据没有错误)是我们可以查看自动生成的字段的值主表,但不在将该值用作外键的交集表中。下面是我们使用的与 INVENTORY 表相关的交集表示例:

创建应收账款表 ( ITEM_LINE INT NOT NULL 始终作为标识生成(从 10 开始,递增 1 最小值 10 无最大值 无循环 无缓存顺序), PAYMENT_TYPE CHAR(15), 备注 CHAR(70), RECEIVED_QUANTITY 整数, VENDOR_ID CHAR(4) 非空, PRODUCT_ID INT, SHIPMENT_ID INT ) 数据捕获无;

INSERT INTO RECEIVEABLES VALUES (DEFAULT,'DISCOVER','Success',9,'1000',DEFAULT,DEFAULT);

当我们查看数据时,我们没有看到任何 NULL 值;我们根本看不到交集表中任何外键字段的任何值(在本例中为 PRODUCT_ID 和 SHIPMENT_ID)。

是否有一种特殊的方法可以将数据插入到交集表中,从而允许主键的值也可以在交集表中表示?

非常感谢您的宝贵时间。我会积极回答您的任何问题

【问题讨论】:

【参考方案1】:

将列命名为外键需要的不仅仅是相同的名称。事实上,名字并不重要。重要的是定义一个 FK 约束:

CREATE TABLE RECEIVABLES ( 
  ITEM_LINE INT NOT NULL Generated always as identity 
   (start with 10 
    increment by 1 
    minvalue 10 
    no maxvalue 
    no cycle 
    no cache order),
  PAYMENT_TYPE CHAR(15), 
  REMARKS CHAR(70), 
  RECEIVED_QUANTITY INTEGER, 
  VENDOR_ID CHAR(4) NOT NULL, 
  PRODUCT_ID INT, 
  SHIPMENT_ID INT, 
  CONSTRAINT inv_fk FOREIGN KEY (product_id) 
     REFERENCES inventory (product_id),
  CONSTRAINT shp_fk FOREIGN KEY (shipment_id) 
     REFERENCES shimpments (shipment_id)
) DATA CAPTURE NONE;

我本来希望在插入后在原始表中看到空值;因为 recieables 中的 product_id 和 shimpment_id 都不是用NOT NULL 定义的。在我发布的表上运行相同的插入,您仍然在 FK 列中为您提供 NULL。

生成的 ID 只在主表中生成。插入 RECEIVABLES 时必须指定值。

现在假设您刚刚在 INVENTORY 中插入了一行,并且您想在 RECEIVABLES 中插入引用它的行。在插入 RECEIVABLES 之前,您必须询问数据库它为 INVENTORY 中的行生成的 ID。

IDENTITY_VAL_LOCAL() 函数就是这样做的一种方式...

【讨论】:

以上是关于DB2:尝试在交叉表中引用自动生成的字段的主要内容,如果未能解决你的问题,请参考以下文章

SQLIte如何设置自动增长的字段?

在SqlServer中怎样设置自动增长字段

SQLIte如何设置自动增长的字段?

SQL Server:交叉引用一个表中的多个列与另一个表中的多个列

DB2 v8 for z/OS 中的交叉连接

如何在 Sphinx 中交叉引用 autodoc 生成的函数?