MYSQL更改枚举值

时间:2018-10-31 07:28:34

标签: mysql laravel mysql-error-1064

在我的名为“ stocktakings”的表中,有一个来自ENUM类型的列,称为“ status”。 “状态”具有以下字段:

  • “待定”
  • “正在处理”
  • “失败”
  • “成功”

我想将值更改为:

  • “准备搬迁”
  • “搜索架位置”
  • “库存更新成功”
  • “库存更新失败”
  • “更新库存”

我尝试了以下命令:

ALTER TABLE `stocktakings` MODIFY `stocktakings.status` 
    `stocktakings.status` ENUM(
        `ready_for_relocation`,
        `search_shelf_location`,
        `stock_update_succeeded`,
        `stock_update_failed`,
        `updating_stock`
);

没用。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

您不能仅从Column定义中删除Old Enum值。否则,将导致无法挽回的数据丢失(所有字段都可能变为空白)。这将是一个多步骤的过程:

向现有列定义添加新的枚举值。另外,枚举值用单引号引起来(而不是反引号)

public async Task<Boat> GetByIdAsync(string id)
    => await _boatContext.Boats.Where(x => x.id == id).FirstOrDefaultAsync();

[Fact]
public async Task GetByIdAsync_WhenCalled_ReturnsItem()
{
    // Arrange
    var models = new[] { new Boat { id = "p1" } };
    var dbContextMock = new DbContextMock<BoatContext>();
    dbContextMock.CreateDbQueryMock(x => x.Boats, models);

    var service = new Properties(dbContextMock.Object);

    // Act
    var okResult = await service.GetByIdAsync("p1");

    // Assert
    Assert.IsType<Boat>(okResult.Result);
}

现在,运行ALTER TABLE `stocktakings` MODIFY `stocktakings`.`status` ENUM( 'Pending', 'Processing', 'Failed', 'Succeeded', 'ready_for_relocation', 'search_shelf_location', 'stock_update_succeeded', 'stock_update_failed', 'updating_stock' ); 查询以相应地更新所有枚举值:

Update

现在,UPDATE `stocktakings` SET status = CASE status WHEN 'Pending' THEN 'ready_for_relocation' WHEN 'Processing' THEN 'search_shelf_location' WHEN 'Failed' THEN 'stock_update_failed' WHEN 'Succeeded' THEN 'stock_update_succeeded' END 并删除旧的枚举值。

Alter Table