【问题标题】:Get a UID primary key before inserting in database在插入数据库之前获取 UID 主键
【发布时间】:2015-02-24 08:25:24
【问题描述】:

我正在创建存储在 SQL 数据库中的用户配置文件(javascript 网页)

这些配置文件有一个主键 ID,它具有自动递增功能。

当用户创建其个人资料时,他必须上传一个文件。

我希望将此文件命名为 id.ext,问题是我在创建配置文件期间通过 ajax 上传文件,在配置文件保存到数据库之前,因为用户需要提供有关此文件的信息为了使配置文件被接受。

我可以重试数据库中的 max(id) 并在我的 ajax 上传期间使用它,但如果 2 个人同时创建配置文件:问题。

我想出了其他解决方案:

  • 将文件命名为bigrandom.ext 并将此名称存储在数据库中,但我的老板绝对想要id.ext
  • 在上传时创建带有“未完成”标志 + 日期的空白配置文件,并每月运行一批以删除数据库中未完成的条目
  • 使用id.ext上传,如果文件已经存在,则命名为id+1.ext,并通过json消息通知网页,返回POST查询

我认为这是一个常见问题,我想有一些关于此的最佳实践,甚至可能是我不知道的 SQL 的一个特性。

【问题讨论】:

  • 您使用的是什么 DBMS(品牌和版本)?文件是作为 LOB 存储在数据库中,还是作为 Web 服务器某处的物理文件存储?您的服务器端代码是否能够在文件上传后立即重命名文件?
  • 现在文件是物理存储的,DBMS 是 Microsoft SQL Server 2012,但是为了能够切换物理blob 和更改 DBMS,一切都已创建,所以我会感到内疚使用专有技巧
  • @IggY 你可以说是在完全错误的水平上处理这个问题。您不应该关心 your 代码中的 DB ID。如果您想将该 ID 用于其他事情(例如文件名),那么您最好的选择是创建一个虚拟行(如果您知道如何安全地执行此操作,则在事务中)并使用该 ID。最好将 DB ID 与文件系统名称分开(尽管有一些可维护性参数支持使用 DB ID)。 GUID 可以作为随机文件名正常工作,即使它们有点长。不要猜测 ID - max(Id) + 1 不安全。

标签: javascript sql asp.net


【解决方案1】:

DBMS 中的sequence object 比使用MAX(id) +1 更安全、更可靠。 MS SQL Server 从 SQL Server 2012 开始支持序列,其他数据库平台支持序列的时间更长。

【讨论】:

  • 看起来正是我所需要的 :) 谢谢!
【解决方案2】:

尝试在表格中添加一个 Guid 字段并在上传图像时创建它。它永远是独一无二的。你可以用这个Guid作为名字保存图像。

【讨论】:

    猜你喜欢
    • 2022-06-14
    • 1970-01-01
    • 2011-10-11
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    相关资源
    最近更新 更多