在SQLAlchemy中创建外键失败

时间:2017-09-25 12:50:12

标签: python mysql database sqlalchemy flask-sqlalchemy

我希望每个用户都有一个名为allocatedstorageavailablestorage的值。这两个值存储在另一个表中。但是,当我创建以下数据库时,它显示以下错误。我究竟做错了什么?谢谢你的帮助。

class User(UserMixin, db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(15), unique=True)
    email = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(80))
    role= db.Column(db.String(20));
    usersessiontoken = db.Column(db.String(500), unique=True)
    hasstorage = db.Column(db.Integer, db.ForeignKey('storageinformation.allocatedstorage'))
    hasavailablestorage = db.Column(db.Integer, db.ForeignKey('storageinformation.availablestorage'))

    storageinformation = db.relationship('StorageInformation', backref='user')

class StorageInformation(UserMixin, db.Model):
    __tablename__ = 'storageinformation'
    id = db.Column(db.Integer, primary_key=True)
    allocatedstorage = db.Column(db.Integer)
    availablestorage = db.Column(db.Integer)

错误:

sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1215, 'Cannot add foreign key constraint') [SQL: '\nCREATE TABLE user (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\tusername VARCHAR(15), \n\temail VARCHAR(50), \n\tpassword VARCHAR(80), \n\t`role` VARCHAR(20), \n\tusersessiontoken VARCHAR(500), \n\thasstorage INTEGER, \n\thasavailablestorage INTEGER, \n\tPRIMARY KEY (id), \n\tUNIQUE (username), \n\tUNIQUE (email), \n\tUNIQUE (usersessiontoken), \n\tFOREIGN KEY(hasstorage) REFERENCES storageinformation (allocatedstorage), \n\tFOREIGN KEY(hasavailablestorage) REFERENCES storageinformation (availablestorage)\n)\n\n']

1 个答案:

答案 0 :(得分:1)

  • 在我的情况下,迁移的输出中未显示实际的原因
  • 仅通过在数据库控制台中运行同一命令
  • ,我才发现问题

命令为 ALTER TABLE assignment ADD FOREIGN KEY(session_id) REFERENCES battery (session_id)

实际问题 Create table 'db_name/#sql-5f9_11e' with foreign key constraint failed. There is no index in the referenced table where the referenced columns appear as the first columns. Cannot add foreign key constraint

Mysql Doc -> Using FOREIGN KEY Constraints

  

MySQL要求在外键和引用键上建立索引,以便   外键检查可以快速进行,不需要进行表扫描。在里面   引用表中,必须有一个索引,其中外键   列以相同顺序列为第一列。

     

InnoDB允许外键引用任何索引列或索引组   列。但是,在引用的表中,必须有一个索引   其中所引用的列被列为   相同的顺序。