1

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

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

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

这工作得很好。

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

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

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

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

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

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

4

1 回答 1

0

实际上,一旦我重新阅读了 except on using AUTO_INCREMENTon multiple columns ,我最终就让它工作了。

对于 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}
于 2013-11-12T21:53:21.423 回答