【问题标题】:Change existing row ID based on AUTO_INCREMENT (unique key)根据 AUTO_INCREMENT(唯一键)更改现有行 ID
【发布时间】:2013-11-25 01:12:40
【问题描述】:

我有一个记录票证的表格,票证由表示“数据库”的列分隔。我在databasecid 列上有一个唯一键,以便它唯一地递增每个数据库(cid 具有AUTO_INCREMENT 属性来完成此操作)。我手动增加id,因为我无法创建两个AUTO_INCREMENT 列(我宁愿AUTO_INCREMENT 处理更复杂的唯一性任务)。

这使我的数据基本上看起来像这样:

-----------------------------
|  id  |  cid  |  database  |
-----------------------------
|    1 |    1  |          1 |
|    2 |    1  |          2 |
|    3 |    2  |          2 |
-----------------------------

这很好用。

我正在尝试制作一个允许将票“移动”到另一个数据库的功能;用户可能经常在错误的数据库中输入票证。不必关闭票证并完全创建一个新票证(复制/粘贴所有数据),我当然想让用户更轻松。

我希望能够唯一更改databasecid 字段,而不必篡改id 字段。我想做一个UPDATE(或类似的),因为其他表上有外键约束,链接到id字段;这就是为什么我不简单地执行REPLACEDELETE 然后INSERT,因为我不希望它删除所有其他表数据然后必须重新创建它(日志条目、事务、约会等)。

如何获取下一个唯一的 AUTO_INCREMENT 值(基于新的 database 值),然后使用它来更新所需的行?

例如,在上面的数据集中,我想将第一条记录更改为“数据库#2”。无论我进行什么查询,都需要将数据更改为此:

-----------------------------
|  id  |  cid  |  database  |
-----------------------------
|    1 |    3  |          2 |
|    2 |    1  |          2 |
|    3 |    2  |          2 |
-----------------------------

我不确定AUTO_INCREMENT 是否需要增加,因为我的理解是唯一键使它只是即时计算下一个适当的值。

【问题讨论】:

  • 这对我来说听起来有点不清楚。此外,在您的第一个示例中,您说 cid 具有 AUTO_INCREMENT,但它没有 1,1,2
  • 确实如此,它根据database 字段递增。我将其设置为类似于以下问题:stackoverflow.com/questions/5416548/… 请注意我对它在 InnoDB 上工作的评论(这是我的表的方案)。
  • 我什至不知道 AUTO_INCREMENT 可以这样工作。凉爽的。就像你说的:你只能拥有其中之一。如果cid + database 是唯一的,为什么要有单列 PK?让你的PK。 (也许这根本不是问题。纠正我。)
  • 是的,问题不在于密钥本身的类型,因为我在那对上有一个唯一的密钥。我的问题是如何在不插入的情况下调用AUTO_INCREMENT 的机制。请看下面我的回答。我将重新评估我的表结构,看看将 cid + database 设置为 PK 是否对其他含义有意义,感谢您的建议。

标签: php mysql auto-increment


【解决方案1】:

实际上,一旦我重新阅读了关于在 multiple columns 上使用 AUTO_INCREMENT 的例外情况,我最终让它工作了。

对于 MyISAM 和 BDB 表,您可以在 多列索引中的第二列。在这种情况下, AUTO_INCREMENT 列的生成值计算为 MAX(auto_increment_column) + 1 WHERE prefix=given-prefix。这是 当您想将数据放入有序组时很有用。

这是我需要的线索。我只是模仿了 MySQL 根据该引用在内部运行的查询,并将其加入到我的UPDATE 查询中。假设$new_database 是要移动到的数据库,$id 是当前票证id

UPDATE `tickets` AS t1,
(
    SELECT MAX(cid) + 1 AS new_cid
    FROM `tickets`
    WHERE database = {$new_database}
) AS t2
SET t1.cid = t2.new_cid,
    t1.database = {$new_database}
WHERE t1.id = {$id}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2010-12-11
    • 2012-11-24
    相关资源
    最近更新 更多