Mysql主键类型改变。整数未签名为二进制(16)

时间:2015-11-10 00:30:03

标签: java android mysql uuid

我在 Android x Web服务器系统上遇到主键(PK)问题,因为用户可以在客户端上创建新对象 - 边和离线。 这些对象将在用户决定时发送到服务器。

此同步导致大量外键(FK)和PK问题,因为我的数据库使用自动增量PK。

为了解决这些完整性问题,经过一些搜索后,我决定最简单的方法是在Android Client和Java Server中使用UUID作为我的PK。

关于UUID和索引的

David Bélanger's answer帮助了很多。

现在我有1个问题和1个问题:

  • 问题:这是我的问题的可接受的解决方案吗?如果它不...可以给我一个替代方案? (实时数据库似乎与我的系统有关)

  • 问题:鉴于我已经有了一个生产数据库并且我无法重新开始,如何将PK从无符号整数更改为二进制(16)。

我的最终选择陈述需要像这样:

  • 从表格中选择ID,其中id = hex('任何ID')

因为我将开始插入这样的数据:

  • 插入表格(id)值(unhex(替换(uuid(),' - ','')));

我尝试使用更新ID  * unhex(id)  * conv(id,10,16)

我错过了什么?

  

编辑:   使用这些脚本,我能够重新创建所有ID和外键

select concat ('alter table ', TABLE_NAME, ' drop foreign key ', CONSTRAINT_NAME, ';') from information_schema.KEY_COLUMN_USAGE where table_schema = 'my_table_name' and CONSTRAINT_NAME like 'fk%'
select concat('alter table ', TABLE_NAME, ' modify ', COLUMN_NAME, ' binary(16) ', IF (IS_NULLABLE = 'NO', 'not null', ''), ';') from information_schema.columns where TABLE_SCHEMA = 'my_table_name' and COLUMN_KEY in ('PRI', 'MUL') and COLUMN_NAME like 'id%'
select concat ('alter table ', TABLE_NAME, ' add constraint ', CONSTRAINT_NAME, ' foreign key (', COLUMN_NAME, ') references ', REFERENCED_TABLE_NAME, ' (', REFERENCED_COLUMN_NAME, ') on update cascade;') from information_schema.KEY_COLUMN_USAGE where table_schema = 'my_table_name' and CONSTRAINT_NAME like 'fk%'
select concat('update ', TABLE_NAME, ' set ', COLUMN_NAME, ' = unhex(replace(uuid(), ''-'', ''''));') from information_schema.COLUMNS where TABLE_SCHEMA = 'my_table_name' and md5(COLUMN_NAME) = md5('id')
select concat ('alter table ', TABLE_NAME, ' drop foreign key ', CONSTRAINT_NAME, ';') from information_schema.KEY_COLUMN_USAGE where table_schema = 'my_table_name' and CONSTRAINT_NAME like 'fk%'
select concat ('alter table ', TABLE_NAME, ' add constraint ', CONSTRAINT_NAME, ' foreign key (', COLUMN_NAME, ') references ', REFERENCED_TABLE_NAME, ' (', REFERENCED_COLUMN_NAME, ');') from information_schema.KEY_COLUMN_USAGE where table_schema = 'my_table_name' and CONSTRAINT_NAME like 'fk%'
  

问题解决了。

0 个答案:

没有答案