我有两张桌子 - " RENTED"和" HISTORY。"一旦项目被退回,我需要将其移至" HISTORY"使用程序的表。这些表在各方面都是相同的。主键只是一个数字,但不是自动递增的。当我尝试将一行从Rented移动到History时,我得到一个冲突,因为主键的ID号都是2。我知道我只需要在HISTORY表中找到主键的最大值,然后添加该行。看似容易,最终很难做到。最后,我删除了RENTED表中的行,我可以这样做。请协助我进行排动。谢谢!
此外,我在这里查看了一些其他类似的代码示例/答案,但还没有找到解决方案。
Create Procedure spMoveToHistory
@RENTED_OUT_NUM bigint
AS
Begin
Insert Into HISTORY
Select *
From RENTED_OUT
Where RENTED_OUT_NUM = @RENTED_OUT_NUM
Select @RENTED_OUT_NUM = (MAX(HISTORY_NUM)+1)
From HISTORY
Delete From RENTED
Where RENTED_OUT_NUM = @RENTED_OUT_NUM
End
所以在这个过程中,我只想输入数字2并在RENTED表中取第二条记录,然后转到HISTORY表的下一个可用行。请参阅下文以更好地查看表格(省略几列)
**RENTED TABLE:**
RENTED_OUT_ID (PK) | ITEM_NAME | ITEM_DESC | DATE_RENTED | DATE_RETURNED
1 data data data data
2 move this data data data data
3 data data data data
**HISTORY TABLE:**
HISTORY_NUM (PK) | ITEM_NAME | ITEM_DESC | DATE_RENTED | DATE_RETURNED
1 data data data data
2 data data data data
-> INSERT HERE
答案 0 :(得分:0)
在HISTORY_NUM
表的HISTORY
列中插入时会出现问题,因为它是主键,无法获取RENTED_OUT_ID
表的RENTED
列的重复值。
因此,找到最大现有HISTORY_NUM
列值并按1递增,以便在每次移动记录时插入新记录。
Create Procedure spMoveToHistory
@RENTED_OUT_NUM bigint
AS
Begin
DECLARE @HISTORY_ID BIGINT
SELECT @HISTORY_ID = MAX(HISTORY_NUM) FROM HISTORY
Insert Into HISTORY(HISTORY_NUM, ITEM_NAME, ITEM_DESC, DATE_RENTED, DATE_RETURNED)
Select @HISTORY_ID + 1 , ITEM_NAME, ITEM_DESC, DATE_RENTED, DATE_RETURNED
From RENTED_OUT
Where RENTED_OUT_ID = @RENTED_OUT_NUM
Delete From RENTED
Where RENTED_OUT_NUM = @RENTED_OUT_NUM
End
答案 1 :(得分:0)
您可以使用OUTPUT INTO子句一次性将已删除的记录插入历史记录表中。语法如下:
declare @max_id bigint
select @max_id = max(HISTORY_NUM)+1 from history
DELETE FROM rented
OUTPUT @max_id
, DELETED.ITEM_NAME
, DELETED.ITEM_DESC
, DELETED.DATE_RENTED
, DELETED.DATE_RETURNED
INTO history
WHERE RENTED_OUT_NUM = @RENTED_OUT_NUM