我正在重写公司的整个系统。原始开发人员在他的数据库中为每个客户报告随机生成了一些愚蠢的ID号。每个身份证号码长达7位数 - 但可以是任何内容。
我正在将他所有的旧数据迁移到我们新的,逻辑结构更为合理的数据库中。我显然想在我们的ID字段中使用MySQL自动增量。 但是,我们保留旧的身份证号码至关重要,因为客户每天都会打电话给那些参考的人。
理想情况下,完美的情况是我们将于12月1日上线 - 截至12月1日的所有内容都是随机ID,从12月1日起,它们会自动从旧数据库中的最高随机ID开始递增。
MySQL没有任何问题可以实现吗?我目前正在使用两列 - 一个是我们的逻辑自动增量ID,另一个是在迁移期间使用的名为old_id
的列。但是我们需要呼叫中心的工作人员只使用一个身份证,否则会产生大量混淆。
谢谢!
答案 0 :(得分:2)
如果从最高随机值开始编号,只需将字段更改为自动增量即可,正常行为是mysql不会更改已设置的ID,并从最高值+ 1开始编号。
如果您想从特定值(比如10,000,000)开始,您可以设置
ALTER TABLE theTableInQuestion AUTO_INCREMENT=10000000
当然,一定要创建备份和测试,但它不应该造成任何问题。 (请注意,旧记录将按照id-field的顺序存储,这是随机的,并且不会反映创建顺序。)
答案 1 :(得分:0)
由于您需要保留旧ID,我将假设您要为自动增量ID创建一个新列,该列将成为您的主键,但保留现有ID列并将其重命名(到old_id,也许?)。我也打算假设你在客户注册时记录。
如果您使旧的ID列可以为空(允许NULL作为有效值),那么您只需检查旧ID列是否为NULL。如果它不是NULL,则将其视为ID,否则使用autoincrement列。
寻找客户:
SELECT *
FROM customer
WHERE (id = /*Put your ID here*/ AND reg_date >= /*Put the date the new regime starts here*/)
OR (id_old = /*put your ID here*/ AND reg_date < /*Put the date the new regime starts here*/)
这有时会返回2行,因此您必须使用其他一些标准来唯一标识相关客户。
对于将旧客户与数据库中的其他表相关联,一旦生成,您始终可以在整个数据库内部使用新ID。显然,您必须更新使用旧ID作为外键的表。
UPDATE target_table
JOIN customers on target_table.cust_id = customers.id_old
SET target_table.cust_id = customers.id;
(注意:以上只是一个快速而肮脏的查询,尚未经过测试!我建议您在真正尝试之前对数据库的副本进行测试!)