簡體   English   中英

如何從一個表中獲取現有記錄的 ID 並將其與其他記錄一起插入到另一個表中?

[英]How to grab an ID of an existing record from one table and insert it along with other records into another table?

在摘要頁面上,每條記錄旁邊都有一個編輯按鈕。

在此屏幕上,客戶要求我們在每條記錄旁邊添加一個“修改記錄”按鈕。

請看截圖。

在此處輸入圖像描述

客戶不希望修改現有記錄。 相反,創建原始記錄的修改版本並插入到另一個表中。

問題是我們如何獲取現有記錄的 ID 並將其與新創建的數據一起插入到另一個表中?

這個想法是我們可以查詢這兩個表並並排顯示現有記錄的現有版本和修改版本。

    <label>Existing activities for next year: </label>
    <input id="btnta" type="button" value="Amend" name="btnta" /><br>
    <textarea id="taskActivities" class="longText" name="taskActivities" maxlength="4999"></textarea>
    <br>
    <div id="dvta" style="display: none">
    <label>Amended activities for next year: </label> <br>
    <textarea id="amended_taskActivities" class="longText" name="amended_taskActivities" maxlength="4999"></textarea>
    </div>
    <br>

隨附的屏幕截圖顯示了兩個文本框,頂部的一個是現有記錄,空文本框用於現有記錄的新修改版本。

任何想法如何處理這個?

我不是 PHP 人 - 提前感謝您的幫助。

我相信您以錯誤的方式處理此問題並產生了XY 問題

您應該做的只是根據需要更新表中的行,並讓數據庫使用row versioning為您處理工作。

大多數現代數據庫都支持row versioning ,它是 SQL 標准的批准部分。

SQL 服務器使用時temporal tables來實現這一點。 我在各種生產系統中的一些選定表上使用它來准確解決您的問題,即更新表中的行但保留這些相同行的先前版本。 這使得故障排除、跟蹤和報告變得非常容易。

在 SQL 服務器中,您可以按如下方式實現:

首先,為版本控制創建一個專用模式 - 我使用history ,因為我將它們稱為歷史表:

create schema history

接下來更改您的表以添加(可選隱藏) startend日期以跟蹤每一行的有效性:

alter table dbo.TableName add
    ValidFrom datetime2 generated always as row start hidden constraint DF_TableNameSysStart default sysutcdatetime(),
    ValidTo datetime2 generated always as row end hidden constraint DF_TableNameSysEnd default convert(datetime2, '9999-12-31 23:59:59.9999999'),
period for system_time (ValidFrom,ValidTo);

然后啟用自動系統版本控制。 SQL 服務器將使用您指定的名稱創建一個表,這里我們在history模式下給它相同的名稱。

alter table TableName set (system_versioning = on (history_table = history.TableName));

並且還定義了一個聚集索引

create clustered index [ix_TableName] on [History].TableName ([ValidTo], [ValidFrom]) 
    with (data_compression = page, drop_existing=on) on History;

最后,一旦到位,您就可以完全正常地查詢主表以獲取每行的當前版本,或者使用一些內置的附加語法來查詢行的先前版本。

select * from TableName for system_time all
where Id=123 
order by ValidTo

這將有效地為您提供指定行與其先前版本的聯合

其他命令提供的功能更多,也可以直接查詢歷史表。

還需要考慮維護(要保留多少歷史記錄?保留 X 前行,X 個月歷史記錄?等)以及如何控制這取決於您的 SQL 服務器版本,最新版本在這里提供了附加功能。

閱讀有關系統版本化時態表的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM