当您说“将记录加载到这些表中”时,您指的是一次性数据迁移还是为新地理区域/城市创建记录的函数?
如果您正在寻找一个代理键并且您的 ID 值有空缺,则可以使用 IDENTITY 列并指定 NO CYCLE 子句,这样它就不会重复任何数字。然后只需将值传递为 NULL 并让 TD 处理它。
如果您确实需要顺序 ID,那么您只需维护一个单独的“NextId”表并使用它来生成 ID 值。这是最灵活的方式,可以让您更轻松地管理 BATCH 操作。它需要您进行更多的代码/维护,但比在数据表上执行 MAX() + 1 以获得下一个 ID 值更有效。基本思路如下:
开始交易
- 从查找表中获取“下一个”ID
- 使用该值为您的下一条记录生成新的 ID 值
- 创建新记录
- 更新查找表中的“下一个”ID 值并将其增加 # 行新插入(您可以通过在执行 INSERT/MERGE 语句后直接将值存储在 ACTIVITY_COUNT 值变量中来捕获这一点)
- 确保在事务开始时锁定查找表,以便在事务完成之前无法修改它
结束交易
这是 Postgres 的一个例子,你可以适应 TD:
CREATE TABLE NextId (
IDType VARCHAR(50) NOT NULL,
NextValue INTEGER NOT NULL,
PRIMARY KEY (IDType)
);
INSERT INTO Users(UserId, UserType)
SELECT
COALESCE(
src.UserId, -- Use UserId if provided (i.e. update existing user)
ROW_NUMBER() OVER(ORDER BY CASE WHEN src.UserId IS NULL THEN 0 ELSE 1 END ASC) +
(id.NextValue - 1) -- Use newly generated UserId (i.e. create new user)
)
AS UserIdFinal,
src.UserType
FROM (
-- Bulk Upsert (get source rows from JSON parameter)
SELECT src.FirstName, src.UserId, src.UserType
FROM JSONB_TO_RECORDSET(pUserDataJSON->'users') AS src(FirstName VARCHAR(100), UserId INTEGER, UserType CHAR(1))
) src
CROSS JOIN (
-- Get next ID value to use
SELECT NextValue
FROM NextId
WHERE IdType = 'User'
FOR UPDATE -- Use "Update" row-lock so it is not read by any other queries also using "Update" row-lock
) id
ON CONFLICT(UserId) DO UPDATE SET
UserType = EXCLUDED.UserType;
-- Increment UserId value
UPDATE NextId
SET NextValue = NextValue + COALESCE(NewUserCount,0)
WHERE IdType = 'User'
;
只需将锁定语句更改为 Teradata 语法 (LOCK TABLE NextId FOR WRITE) 并在 INSERT/MERGE 之后添加一个 ACTIVITY_COUNT 变量以捕获受影响的 # 行。这假设您在存储过程中执行所有这些操作。
告诉我进展如何...