我在CakePHP 1.2.11上构建了Web应用程序。和mysql数据库。在这个应用程序中,我有两个表,即用户和操作。用户有多个操作,user_id(用户表中的id)是actions表中的外键。 id字段是autoincrement integer。
CakePHP文档说,将id字段设置为Char(36)将使CakePHP能够为每条记录生成唯一字符串作为id。
我的应用程序正在运行,我不想丢失我的应用程序已经拥有的数据记录。我需要知道是否可以安全地从autoincrement整数id迁移到char(36),同时记住相关的表?
换句话说,我怎样才能将整数值更改为cakephp的唯一字符串id?有规则吗?如果有任何工具自动进行这种迁移,我将不胜感激。
答案 0 :(得分:2)
是的,只需更改表以使用varchar。 INT
列可以转换为char,因此您不会丢失原始ID(最终会混合使用旧的常规int和新的uuids)。您还需要确保对还需要存储VARCHAR(36)
的任何其他表上的任何外键进行更改。
然后确保立即推送新代码,否则将无法创建新记录,因为varchar字段无法自动增加。
最后,在推送新代码后立即清除模型缓存,这样Cake仍然认为它不是INT
。
答案 1 :(得分:0)
您确定要切换吗?
老实说,除非你有一个很好的理由改为UUID(CHAR(36)),否则我建议保留自动递增ID。有很多人吹嘘每个人的好处,但它归结为自动递增ID可以更快,除非你有多个数据库,你担心重叠数据,自动ids就好了。 (而且这不是一个简单的“开关”)
不简单:
如果您仍然确定要切换到UUID,则没有自动化过程,但要小心 - 这不仅仅是关于切换字段类型和瞧 - 您必须创建脚本或更新ID的内容字段以及所有相关字段(即'actions'表中的'user_id'将不会更新..等等。)
如果是,请按以下方式进行:
所以 - 创建一个数据库(或表)的副本作为备份。然后,您可能希望将'id'字段重命名为'autoid',创建另一个id字段CHAR(36),运行脚本以填充所有UUID,然后填充相关id的另一个脚本(即'user_id'in 'actions'表)和相应的UUID。
生成UUID的CakePHP代码:
以下是在CakePHP 1.2中创建UUID的链接:http://book.cakephp.org/1.2/en/view/826/uuid