如何将标识列的值用于同一插入中的不同列

Posted

技术标签:

【中文标题】如何将标识列的值用于同一插入中的不同列【英文标题】:how to use the value of an Identity column for a diffent column in the same insert 【发布时间】:2009-12-04 06:45:49 【问题描述】:

我已经创建了一个这样的表:

CREATE TABLE A
( ID BIGINT NOT NULL GENERATED BY DEFAULT AS IDENTITY (
START WITH +1
INCREMENT BY +1
NO MINVALUE
NO MAXVALUE
NO CYCLE
CACHE 20
NO ORDER )
, ID_MIRROR CHAR(20))

我想做一个插入,以便自动设置 ID,ID_MIRROR 将是 ID 中的内容,但前缀为“PRE”。

我没有成功尝试以下方法:

INSERT INTO A (ID_MIRROR) 
VALUES ( 'PRE' || CHAR(A.ID))

错误 2009 年 12 月 4 日 6:43:08 AM 0:00:00.296 DB2 数据库错误: 错误 [42703] [IBM][DB2/AIX64] SQL0206N “A.ID”在 使用它的上下文。 SQLSTATE=42703 1 0

insert into A (id_mirror)
VALUES (CONCAT('PRE', CHAR(identity_val_local())))

ID_MIRROR 为 NULL,后续插入为之前的 ID 值。

insert into A (id_mirror)
VALUES (CONCAT('PRE', CHAR(scope_identity())))

错误 2009 年 12 月 4 日 6:11:11 AM 0:00:00.234 DB2 数据库错误: 错误 [42884] [IBM][DB2/AIX64] SQL0440N 没有命名的授权例程 “功能”类型的“SCOPE_IDENTITY” 找到了兼容的参数。 SQLSTATE=42884 1 0

【问题讨论】:

@Michael:如果您发布 SQL(或其他)代码,请突出显示您的代码行,然后按编辑器工具栏上的“代码”按钮 (010 101) 以启用漂亮的格式和语法突出显示- 谢谢! 【参考方案1】:

另一个论坛回答了这样的问题:

INSERT INTO A (ID_MIRROR) VALUES ( 'PRE' || IDENTITY_VAL_LOCAL());

【讨论】:

【参考方案2】:

如果您可以随时在 SELECT 语句中临时创建此列,为什么还需要这样做?

【讨论】:

蒂姆,至少有两个原因: 1) ID_MIRROR 中的现有行与同一模式不匹配,因此无法在 SELECT 上重新创建它们。 2) 即使将数据加载到新表中,ID_MIRROR 列也会保持不变。 [db2 load 有可以重置 ID 的选项] 如果出于某种原因您想维护自动生成 ID 的历史记录(尽管我想不出任何需要这样做的好设计),并且如果重新加载表会自动生成新 ID,并且是否有可能多次重新加载数据(有)然后单个镜像列不足以完成任务。您需要一个与基表具有多对一关系的外部表。您可以在基表上使用插入后触发器将自动 ID 插入到 id-archive 表中。 我不明白你关于“ID_MIRROR 中的现有行不匹配相同模式”的第一句话。 ID_MIRROR 不包含行,而是带有前缀字符串的自动 ID。你是说前缀有时会改变?

以上是关于如何将标识列的值用于同一插入中的不同列的主要内容,如果未能解决你的问题,请参考以下文章

插入标识列的 BCP 格式是啥

Java:如何使用用于 Sql Server 的 java jdbc 执行带有标识列的批量插入

如何强制实体框架插入标识列?

如何捕获插入到包含标识列的 Redshift 表中的行数?

sqlserver向数据库插入数据的时候,自增张(标识列)列不允许为空,怎样插入该列数据?

SQL Server中的标识列