繁体   English   中英

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

[英]Change existing row ID based on AUTO_INCREMENT (unique key)

我有一个表,用于记录票证,这些票证由表示“数据库”的列分隔。 我在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 ,因为我的理解是唯一键使它可以即时计算下一个适当的值。

实际上,一旦我重新阅读了有关在多列上使用AUTO_INCREMENT ,我最终使它工作了。

对于MyISAM和BDB表,可以在多列索引的第二列上指定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}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM