Ограничение внешнего ключа неправильно сформировано — python sqlalchemy

#python #mysql #sqlalchemy

Вопрос:

Не удается создать таблицу ctfd . discorduser (ошибка: 150 «Неправильно сформировано ограничение внешнего ключа»)

 CREATE TABLE discorduser (  id BIGINT NOT NULL AUTO_INCREMENT,  username VARCHAR(128),  discriminator INTEGER,  avatar_hash VARCHAR(256),  mfa_enabled BOOL,  verified BOOL,  email VARCHAR(256),  PRIMARY KEY (id),  UNIQUE (id),  UNIQUE (id),  FOREIGN KEY(username) REFERENCES users (name) ON DELETE CASCADE,  CHECK (mfa_enabled IN (0, 1)),  CHECK (verified IN (0, 1)) )  

Модели определяются следующим образом:

 class Users(db.Model):  __tablename__ = "users"  __table_args__ = (db.UniqueConstraint("id", "oauth_id"), {})  # Core attributes  id = db.Column(db.Integer, primary_key=True)  oauth_id = db.Column(db.Integer, unique=True)  # User names are not constrained to be unique to allow for official/unofficial teams.  name = db.Column(db.String(128))  password = db.Column(db.String(128))  email = db.Column(db.String(128), unique=True)  type = db.Column(db.String(80))  secret = db.Column(db.String(128))   # Supplementary attributes  website = db.Column(db.String(128))  affiliation = db.Column(db.String(128))  country = db.Column(db.String(32))  bracket = db.Column(db.String(32))  hidden = db.Column(db.Boolean, default=False)  banned = db.Column(db.Boolean, default=False)  verified = db.Column(db.Boolean, default=False)   # Relationship for Teams  team_id = db.Column(db.Integer, db.ForeignKey("teams.id"))   field_entries = db.relationship(  "UserFieldEntries", foreign_keys="UserFieldEntries.user_id", lazy="joined"  )   created = db.Column(db.DateTime, default=datetime.datetime.utcnow)   __mapper_args__ = {"polymorphic_identity": "user", "polymorphic_on": type}   def __init__(self, **kwargs):  super(Users, self).__init__(**kwargs)   class DiscordUser(db.Model):  __tablename__ = "discorduser"  __table_args__ = (db.UniqueConstraint("id"), {})   # Core variables  id = db.Column(db.BigInteger, primary_key=True, unique=True) # Discord ID, int64  # Discord Username 2-32 characters  username = db.Column(db.String(128), db.ForeignKey("users.name", ondelete="CASCADE"))    

Что может быть причиной этого? Тип имени пользователя одинаков для обоих, и у меня сложилось впечатление, что внешние ключи не нужно ограничивать.

Комментарии:

1. Предоставьте СОЗДАТЬ ТАБЛИЦУ для users . Колонка name должна быть VARCHAR(128) и UNIQUE .

2. Имя не является уникальным. Могу ли я вместо этого привязать таблицу к идентификатору?

3. Могу ли я вместо этого привязать таблицу к идентификатору? Ты должен, а не можешь. И discorduser соответствующим образом измените тип данных.

4. Если я сделаю имя уникальным, смогу ли я сохранить discorduser то же самое?

5. Столбец, на который вы ссылаетесь, должен быть однозначно проиндексирован. если нет, то вы получите сообщение об ошибке при попытке создать FK. И FK по столбцу строкового типа не очень хорошая идея — установите ссылку по id и получите соответствующее имя в запросе с правильным соединением.