[英]Change existing row ID based on AUTO_INCREMENT (unique key)
我有一个表,用于记录票证,这些票证由表示“数据库”的列分隔。 我在database
和cid
列上有一个唯一键,以便它唯一地递增每个数据库( cid
具有AUTO_INCREMENT
属性来完成此操作)。 我无法手动增加id
,因为我无法创建两个AUTO_INCREMENT
列(而我宁愿AUTO_INCREMENT
负责更复杂的唯一性任务)。
这使我的数据基本上像这样:
-----------------------------
| id | cid | database |
-----------------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 2 |
-----------------------------
这工作得很好。
我正在尝试使票证可以“移动”到另一个数据库的功能。 用户经常会在错误的数据库中输入票证。 我不必关闭票证并完全创建一张新票证(复制/粘贴所有数据),当然希望使用户更轻松。
我希望能够唯一地更改database
和cid
字段,而不必篡改id
字段。 我想进行UPDATE
(或类似操作),因为其他表上的外键约束都指向id
字段; 这就是为什么我不简单地执行REPLACE
或DELETE
然后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.