【问题标题】:How to grab an ID of an existing record from one table and insert it along with other records into another table?如何从一个表中获取现有记录的 ID 并将其与其他记录一起插入到另一个表中?
【发布时间】:2021-06-06 05:10:40
【问题描述】:

在摘要页面上,每条记录旁边都有一个编辑按钮。

在此屏幕上,客户要求我们在每条记录旁边添加一个修改记录按钮。

请看截图。

客户端不希望修改现有记录。而是创建原始记录的修改版本并插入到另一个表中。

问题是我们如何获取这条现有记录的 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 专家 - 提前感谢您的帮助。

【问题讨论】:

  • 如果上面的 HTML 是表单的一部分或收集在 JavaScript 操作中,您可以使用具有源 ID 的隐藏 &lt;input&gt;。在填充其他字段的同时填充它,并在读取其他字段的同时读取它????
  • 非常感谢您的回复先生。我最接近获取源 ID 的是来自以下更新语句的 $rowid:Where Id = $rowId"; 由于空间而缩短。我在一个蓝色的月亮上做一次php。我碰巧是 .net/js 的家伙。谢谢你指导我。

标签: php html sql-server forms


【解决方案1】:

我相信您以错误的方式处理此问题并生成了XY Problem

您应该做的只是根据需要更新表中的行,并让 数据库 使用 row versioning 为您处理工作。

大多数现代数据库都支持row versioning,它是 SQL 标准的批准部分。

SQL Server 使用temporal tables 来实现这一点。我在各种生产系统中的一些选定表上使用它来准确解决您的问题,即更新表中的行但保留这些相同行的先前版本。这使得故障排除、跟踪和报告变得非常容易。

在 SQL Server 中,您可以按如下方式实现:

首先,为版本控制创建一个专用架构 - 我使用 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 Server 将使用您指定的名称创建一个表,这里我们在 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 Server 版本,最新版本在此处提供了附加功能。

阅读更多关于system versioned temporal tables

【讨论】:

  • 感谢您的回复。是的,我对临时表了解一点。事实上,在决定反对它之前,我曾尝试在我的上一个项目中使用它,因为 SQL Server 不是正确的版本。我在这种情况下使用它的问题是它是否仍然需要我创建一个空文本框并输入新数据,或者只是更新从文本框上的数据库填充的现有数据?他们拒绝了摆脱创建空文本框并输入新数据的选项。
猜你喜欢
  • 2017-05-27
  • 2015-11-03
  • 2021-08-25
  • 2010-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多