【问题标题】:MySQL: is there something like an internal record identifier for every record in a MySQL table?MySQL:对于 MySQL 表中的每条记录,是否有类似内部记录标识符的东西?
【发布时间】:2010-02-13 15:30:22
【问题描述】:

我正在构建一个使用 MySQL 作为存储的电子表格应用程序,我需要识别正在客户端更新的记录以保存更改。

有没有办法,例如某种“内部记录标识符”(数据库引擎本身使用的内部)来唯一标识记录,以便我能够更新正确的记录?

当然,可以使用 SELECT 查询来识别记录,包括表中的所有字段,但显然在大多数情况下会返回多条记录。

重要提示:电子表格应用程序旨在处理任何表,即使是设计极差的表,也没有任何键,因此不能选择“使用唯一索引定义字段并使用它”等解决方案,表结构可能非常多变,一定不重要。

非常感谢。

【问题讨论】:

    标签: mysql record identifier


    【解决方案1】:

    AFAIK 不存在这样的唯一内部标识符(例如,简单的行 ID)。

    也许 也许能够在不进行任何排序的情况下运行SELECT,然后使用LIMIT 获得第n 行。在什么条件下使用是可靠和安全的,mySQL Guru 需要确认。它可能永远不会。

    尝试使用 mySQL 的 Web 前端 phpMyAdmin。它旨在处理没有键的设计不良的表。如果我没记错的话,它使用 all 在这种情况下可以获取的列:

    UPDATE xyz set a = b WHERE 'fieldname'  = 'value' 
                           AND 'fieldname2' = 'value2' 
                           AND 'fieldname3' = 'value3' 
                           LIMIT 0,1;
    

    等等。

    当然,这也不完全是重复安全的。

    我想到的唯一想法是在运行时添加一个键列,并在您的应用程序完成时将其删除。这是一个令人起鸡皮疙瘩的想法,但也许总比没有好。

    【讨论】:

    • 我相信 phpMyAdmin 还会在没有可用主键的 DELETE 和 UPDATE 子句中添加 LIMIT 1。
    • @Adam True。我将它添加到示例中。只要 phpMyAdmin 是访问数据库的唯一实例,这可能是安全的。
    • 干杯。这正是我目前采用的解决方案,而且绝对不是重复安全的。哇,我感觉鸡皮疙瘩都起来了。后者实际上是一个绝妙的想法,确实令人起鸡皮疙瘩,但即使我要承担任务,我也无法更改表结构。这必须在一个全新的临时表中播放。谢谢。
    【解决方案2】:

    MySQL 具有“自动递增”数字列,您可以添加甚至定义为主键,这将为您提供由数据库自动生成的唯一记录 ID。可以用select LAST_INSERT_ID()查询刚刚插入的最后一条记录id

    mysql官方文档here的例子

    【讨论】:

    • 好主意,有,但不符合规范:无法控制表结构,无法添加字段、键。
    【解决方案3】:

    据我所知,MySQL 缺乏 Oracle 中所见的隐式 ROWID 功能(并且存在于其他具有自己语法的引擎中)。您必须创建自己的AUTO_INCREMENT field

    【讨论】:

    • 不符合规范:无法控制表结构,无法添加字段、键。您提到的 ROWID 功能可能就是我要谈论的内容。谢谢。
    猜你喜欢
    • 2022-12-10
    • 2020-11-02
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 2010-12-28
    • 1970-01-01
    • 2021-05-03
    相关资源
    最近更新 更多