我有一个大表(约 400 万行,约 100 个字段),我需要按类型将其拆分为几个较小的表,这样它就不会随着它的增长而变得难以管理。
每个条目都有一个 ID,它是一个自动生成的主键。将数据移动到新表时需要保留这些键。此外,还需要生成新的唯一密钥;这些将需要在所有较小的表中都是唯一的,而不仅仅是在每个表本身内。
我在想一种方法是在将数据传输到新表时将 ID 传输到新字段(或非自动生成的主键字段?)。传输数据后,我可以剥离原始表,使其只是一个主键,因此它可以继续为任何其他数据自动生成键 - 即在将数据插入其中一个新表之前,从原表。
然而,这似乎相当笨拙!
它还留下了一个问题,如果用户在不知道数据是什么类型的情况下引用一个 ID(即它将在哪个表中找到),他们如何“定向”到正确的表?
我确定必须有更好的方法来做到这一点?
当你有一个带有 auto_increment的主键时,只有当你插入一个 NULL 值时它才会生成一个新的 ID。如果您在 中设置ID =4
INSERT
,则 ID 将为 4,因此您不会在“移动”操作期间丢失您的 ID。我们没有 Oracle 数据库中的“SEQUENCE”概念,因此您的“全局 ID”问题并不容易解决。
也许你可以尝试这样的事情(但它只会增加 400 万行表的复杂性)
创建一个用于生成“全局 ID”的表,其中一个 int 字段为 auto_incremented:
当您想在子表中插入新行时:
SELECT
解决方案1:在information_schema
在 ypercube 评论后编辑:
解决方案 2:使用
LAST_INSERT_ID()
如果您不使用对应用程序透明的分区,则需要:
为将隐藏上述所有内容的应用程序创建一个视图
好消息是您可以在表之间使用内连接,因为您总是在一个或另一个中拥有记录
我相信 mysql 仍然缺少视图上的 INSTEAD OF 触发器,因此对于 DML 操作,您将需要存储过程。
我认为不清楚,您将从 p2 在表中创建一个新键,并使用该值将记录从 p1 插入表中。