【发布时间】:2013-11-25 01:12:40
【问题描述】:
我有一个记录票证的表格,票证由表示“数据库”的列分隔。我在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 是否需要增加,因为我的理解是唯一键使它只是即时计算下一个适当的值。
【问题讨论】:
-
这对我来说听起来有点不清楚。此外,在您的第一个示例中,您说
cid具有 AUTO_INCREMENT,但它没有1,1,2。 -
确实如此,它根据
database字段递增。我将其设置为类似于以下问题:stackoverflow.com/questions/5416548/… 请注意我对它在 InnoDB 上工作的评论(这是我的表的方案)。 -
我什至不知道 AUTO_INCREMENT 可以这样工作。凉爽的。就像你说的:你只能拥有其中之一。如果
cid + database是唯一的,为什么要有单列 PK?让你的PK。 (也许这根本不是问题。纠正我。) -
是的,问题不在于密钥本身的类型,因为我在那对上有一个唯一的密钥。我的问题是如何在不插入的情况下调用
AUTO_INCREMENT的机制。请看下面我的回答。我将重新评估我的表结构,看看将cid + database设置为 PK 是否对其他含义有意义,感谢您的建议。
标签: php mysql auto-increment