我有一个表记录由表示“数据库”的列分隔的票证。我在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
值),然后使用它来更新所需的行?
例如,在上面的数据集中,我想将第一条记录更改为“database#2”。无论我做什么查询都需要将数据更改为:
-----------------------------
| id | cid | database |
-----------------------------
| 1 | 3 | 2 |
| 2 | 1 | 2 |
| 3 | 2 | 2 |
-----------------------------
我不确定AUTO_INCREMENT
是否需要递增,因为我的理解是唯一键使它只是动态计算下一个合适的值。
答案 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}