添加主键在蒸馏器现有的MySQL表(Adding primary key to existing M

2019-07-04 16:43发布

我想一个“身份证”的主键列添加到已经存在的MySQL表使用蒸馏器。 我尝试以下...

op.add_column('mytable', sa.Column('id', sa.Integer(), nullable=False))
op.alter_column('mytable', 'id', autoincrement=True, existing_type=sa.Integer(), existing_server_default=False, existing_nullable=False) 

但有以下错误

sqlalchemy.exc.OperationalError: (OperationalError) (1075, 'Incorrect table definition; there can be only one auto column and it must be defined as a key') 'ALTER TABLE mytable CHANGE id id INTEGER NOT NULL AUTO_INCREMENT' ()

看起来像由蒸馏器产生的未添加的SQL语句PRIMARY KEY的ALTER语句的结束。 我可能已经错过了一些设置?

提前致谢!

Answer 1:

我花了一些时间通过蒸馏器的源代码挖掘,而这似乎并没有得到支持。 您可以创建一个表时,但不能添加列时指定的主键。 事实上,它专门检查,不会让你( 链接到源 ):

# from alembic.operations.toimpl.add_column, line 132
for constraint in t.constraints:
    if not isinstance(constraint, sa_schema.PrimaryKeyConstraint):
        operations.impl.add_constraint(constraint)

我环顾四周,并添加主键到现有表可能会导致不确定的行为 - 主键不应该为空,所以你的引擎可能会或可能不会产生现有行的主键。 详情参见本SO讨论: 对现有的表中插入自动递增的主键

我只是直接运行ALTER查询,如果你需要创建一个主键。

op.execute("ALTER TABLE mytable ADD id INT PRIMARY KEY AUTO_INCREMENT;")

如果你真的需要跨引擎的兼容性,大铁锤将(1)创建一个新表等同于旧有一个主键,(2)迁移所有数据,(3)删除旧表和(4 )重命名新表。

希望帮助。



文章来源: Adding primary key to existing MySQL table in alembic