根据AUTO_INCREMENT(唯一键)更改现有行ID

时间:2013-11-12 18:12:40

标签: php mysql auto-increment

我有一个表记录由表示“数据库”的列分隔的票证。我在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值),然后使用它来更新所需的行?

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

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

我不确定AUTO_INCREMENT是否需要递增,因为我的理解是唯一键使它只是动态计算下一个合适的值。

1 个答案:

答案 0 :(得分:0)

除了在multiple columns上使用AUTO_INCREMENT外,我实际上在重新阅读之后才开始工作。

  

对于MyISAM和BDB表,您可以在a上指定AUTO_INCREMENT   多列索引中的辅助列。在这种情况下,   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}