【问题标题】:Change id from autoincrement to char 36 in CakePHP在 CakePHP 中将 id 从 autoincrement 更改为 char 36
【发布时间】:2012-11-07 13:57:27
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php mysql database cakephp cakephp-1.2


    【解决方案1】:

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

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

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

    【讨论】:

    • 你确定 CakePHP 1.2.11 能够像使用 CHAR 一样使用 VARCHAR 做到这一点吗?
    • 两者都可以。我想 VARCHAR 不是必需的,因为长度总是相同的。
    • Char(36) / varchar(36) 可以工作,虽然 cake 没有实现 char 所以你不能在迁移和固定装置中使用它。会自动转成varchar
    【解决方案2】:

    确定要切换吗?

    老实说,除非您有充分的理由更改为 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

    【讨论】:

    • 是的,我确定并且我需要它,因为用户可能会删除操作,所以我不希望将来有 100,140,​​149 等 ids 值!
    • @sємsєм - 我很高兴你确定。虽然-您的示例不是需要切换的理由。人们在具有数百万条记录的表上使用自动递增的 ID,这些记录一直被添加和删除,而不会出现问题。删除后它们不是增量的也没关系。
    • 为了完成这个有价值的讨论的好处,我在 MySQL 中为自动增量 INT 设置的最大长度是多少?我的意思是最大值,我可以获得最大记录的长度,以保持应用程序在共享主机上的性能优化。例如:在我的 web 应用程序中,我将操作表的 id 设置为长度为 9 的中等整数,那么这个值是否合适?
    • @sємsєм - 我看到的“标准”是 10(有些保留为默认 11),所以如果 9 适合你,那就更好了。
    • 您可以在 cake2.x 中拥有 bigint 字段,当未签名时可以达到 18446744073709551615。另一方面,UUIDs 有 340282366920938463463374607431768211456 组合。
    猜你喜欢
    • 2012-07-15
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多