我在 Android x Web服务器系统上遇到主键(PK)问题,因为用户可以在客户端上创建新对象 - 边和离线。 这些对象将在用户决定时发送到服务器。
此同步导致大量外键(FK)和PK问题,因为我的数据库使用自动增量PK。
为了解决这些完整性问题,经过一些搜索后,我决定最简单的方法是在Android Client和Java Server中使用UUID作为我的PK。
关于UUID和索引的David Bélanger's answer帮助了很多。
现在我有1个问题和1个问题:
问题:这是我的问题的可接受的解决方案吗?如果它不...可以给我一个替代方案? (实时数据库似乎与我的系统有关)
问题:鉴于我已经有了一个生产数据库并且我无法重新开始,如何将PK从无符号整数更改为二进制(16)。
我的最终选择陈述需要像这样:
因为我将开始插入这样的数据:
我尝试使用更新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%'
问题解决了。