2

我有基于 CakePHP 1.2.11 的 Web 应用程序。和mysql数据库。在这个应用程序中,我有两个表,即用户和操作。用户有许多操作,而 user_id(用户表中的 id)是操作表中的外键。id 字段是自增整数。

CakePHP 文档说,将 id 字段设置为 Char(36) 将使 CakePHP 能够为每条记录生成唯一字符串作为 id。

我的应用程序正在运行,我不想丢失我的应用程序已有的数据记录。我需要知道是否可以安全地从自动增量整数 id 迁移到 char(36) 记住相关表?

换句话说,我怎样才能将整数值更改为 cakephp 所做的唯一字符串 id?有什么规则吗?如果有任何工具可以自动执行这种迁移,我将不胜感激。

4

2 回答 2

2

是的,只需更改表以使用 varchar。列可以INT转换为字符,因此您不会丢失原始 ID(您最终会得到旧的常规整数和新的 uuid 的混合)。您需要确保也对需要存储的任何其他表上的任何外键进行更改VARCHAR(36)

然后确保立即推送新代码,否则将无法创建新记录,因为 varchar 字段不能自动递增。

最后,在推送新代码后立即清除模型缓存,这样 Cake 就不会认为它是INT.

于 2012-11-07T14:57:28.520 回答
0

您确定要切换吗?

老实说,除非您有充分的理由更改为 UUID (CHAR(36)),否则我建议您只使用自动递增的 ID。有很多人吹捧每种方法的好处,但归结为自动递增 ID 可以更快,除非您有多个数据库担心重叠数据,否则自动递增 ID 就可以了。(而且它不是一个简单的“开关”)

不疯狂 - 简单:

如果您仍然确定要切换到 UUID,则没有自动化过程,但要小心 - 这不仅仅是切换字段类型和瞧 - 您还必须创建一个脚本或其他东西来更新 id 字段因为所有相关字段(即“actions”表中的“user_id”将不会被更新..etc 等)。

如果是这样,方法如下:

所以 - 创建您的数据库(或表)的副本作为备份。然后您可能想要将“id”字段重命名为“autoid”,创建另一个 id 字段 CHAR(36),运行一个脚本来填充所有 UUID,然后另一个脚本填充相关的 id(即“user_id”在'actions' 表)和相应的 UUID。

生成 UUID 的 CakePHP 代码:

这是在 CakePHP 1.2 中创建 UUID 的链接:http: //book.cakephp.org/1.2/en/view/826/uuid

于 2012-11-07T16:35:12.520 回答