【问题标题】:PHP restoring data in the case of failed migration迁移失败情况下PHP恢复数据
【发布时间】:2015-12-24 13:51:55
【问题描述】:

我有一张供应商表格,其结构如下:

注意提供者字段。现在是VARCHAR。我必须从另一个开发人员那里支持这个系统,现在我们需要提供提供者列表并存储其他信息,所以我创建了另一个表来实际存储提供者。

结构如下:id、name、margin、outer_name等

我打算将提供者的类型更改为INT(32),它将指向提供者表。

问题在于 MySQL 不支持更改数据库结构的事务。

如果我将字段类型从字符串更改为整数,我会丢失所有以前的数据。如果中间出现问题。我迷路了。

可以使用序列化将数据转储到文件并从那里读取它们吗?

有没有更好的方法?

【问题讨论】:

  • 最安全的方法:mysqldump到文件,编辑文件更改字段定义,保存到单独的dump文件。加载修改后的转储,如果发生故障,您将原始转储作为后备。
  • 你能不能添加一个额外的字段,比如 provider_id,它引用你的新表结构,执行你的迁移并基本上并排运行两个系统。一旦您感到满意,就没有问题(条目可能在两个字段中都有值?)删除或空白旧的“提供者”字段。
  • Graeme,对我来说似乎是最简单的解决方案。无需创建新表。可能有必要为更复杂的情况创建一个新表,但正是在这种情况下,我认为没有必要。如果您将其发布为答案,我会接受它

标签: mysql sql sql-update migration alter-table


【解决方案1】:

请按照以下步骤将数据迁移到新表并更改列。

1.将所有数据插入新表(Provider Table)

INSERT INTO providerTable (NAME) 
SELECT DISTINCT provider
FROM suppliers;

2。将 providerID 更新到主(供应商)表中

UPDATE suppliers s 
INNER JOIN providerTable p ON s.provider = p.name 
SET s.provider = p.id;

在更改表格之前,请在供应商表格中验证您的数据。

3.然后更改主(供应商)表的列数据类型

ALTER TABLE suppliers CHANGE provider provider INT(4) NOT NULL

使用这种方法,您不需要备份表。您不会丢失任何数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    相关资源
    最近更新 更多