mysql 尝试通过关联表添加第二条记录时出现唯一约束错误

dxxyhpgq  于 2023-05-05  发布在  Mysql
关注(0)|答案(3)|浏览(127)

我正在使用nodejs,sequelize和mysql。我有3个表,user,participe和tirage,我这样定义我的关联:

db.users.belongsToMany(db.tirages, {through: db.participe, foreignKey:'participantId', as: 'participatingTiragesParticipant'});

db.users.belongsToMany(db.tirages, {through: db.participe, foreignKey:'cadeauA', as: 'CadeauTirage'});

db.tirages.belongsToMany(db.users, {through: db.participe, foreignKey:'tirageUuid', as: 'participatingTiragesTirage'})

下面是participe table的模型:

module.exports = (sequelize, Sequelize) => {
    const Participe = sequelize.define("participe", {
        uuid: {
            type: Sequelize.UUID,
            primaryKey: true,
            defaultValue: Sequelize.UUIDV1
        },
        cadeauA: {
            type: Sequelize.UUID
        },
        participantId: {
            type: Sequelize.UUID
        },
        tirageUuid: {
            type: Sequelize.UUID
        },
        isAdmin: {
            type: Sequelize.BOOLEAN
        }
    });
    return Participe;
  };

感谢这段代码,我添加了记录:

const user = await User.findOne({
    where: {
      uuid: req.body.user
    }
  });

  const tirage = await Tirage.create(tirageOptions);

  if (tirage && user) {
    await user.addParticipatingTiragesParticipant(tirage, { through: { isAdmin: true } });
  }

当我给一个刚创建的用户添加一个tirage时,它可以工作,但是如果我尝试在同一个用户上添加另一个tirage,它就不能工作,错误是:

errors: [
    ValidationErrorItem {
      message: 'undefined must be unique',
      type: 'unique violation',
      path: 'undefined',
      value: null,
      origin: 'DB',
      instance: null,
      validatorKey: 'not_unique',
      validatorName: null,
      validatorArgs: []
    }
  ],

我在其他论坛上看到这个问题是关于续集中的m:n关联,但我没有找到任何东西来修复它。我还在我的数据库中看到我创建了一些约束:
constraints in database image
这是其中一个错误:
Error in console image
你知道该怎么做吗?
如果你需要我的项目/我使用的技术的进一步细节,不要犹豫。多谢了。
下面是为创建表participes而生成的SQL:

Executing (default): DROP TABLE IF EXISTS `participes`;
Executing (default): CREATE TABLE IF NOT EXISTS `participes` (`uuid` CHAR(36) BINARY , `cadeauA` CHAR(36) BINARY, `participantId` CHAR(36) 
BINARY, `tirageUuid` CHAR(36) BINARY, `isAdmin` TINYINT(1), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, UNIQUE `participes_tirageUuid_cadeauA_unique` (`cadeauA`, `tirageUuid`), UNIQUE `participes_participantId_tirageUuid_unique` (`participantId`), PRIMARY KEY 
(`uuid`)) ENGINE=InnoDB;
syqv5f0l

syqv5f0l1#

我把它修好了,我不得不这样声明我的联想:

db.users.belongsToMany(db.tirages, { through: { model: db.participe, unique: false }, foreignKey: 'participantId', constraints: false, as: 'participatingTiragesParticipant' });
db.users.belongsToMany(db.tirages, { through: { model: db.participe, unique: false }, foreignKey: 'cadeauA', constraints: false, as: 'CadeauTirage' });
db.tirages.belongsToMany(db.users, { through: { model: db.participe, unique: false }, foreignKey: 'tirageUuid', constraints: false, as: 'participatingTiragesTirage' });

非常感谢你的帮助。

iaqfqrcu

iaqfqrcu2#

使用约束:假联想

db.users.belongsToMany(db.tirages, {through: db.participe, foreignKey:'participantId', constraints: false, as: 'participatingTiragesParticipant'});

db.users.belongsToMany(db.tirages, {through: db.participe, foreignKey:'cadeauA', constraints: false, as: 'CadeauTirage'});

db.tirages.belongsToMany(db.users, {through: db.participe, foreignKey:'tirageUuid', constraints: false, as: 'participatingTiragesTirage'})
3bygqnnd

3bygqnnd3#

也许与此无关,但我也有同样的问题,你的帖子首先出现在谷歌上。因此,如果您有同样的问题,并且您的MySQL已经配置为英语,请跳过此响应。
如果你的MySQL不是用英语配置的,正则表达式将不再起作用。我不知道为什么他们不使用MySQL错误代码
当你阅读Sequelize的源代码时,在MySQL部分你可以看到产生问题的正则表达式:sequelize/packages/core/src/dialects/mysql/query.js
最简单的解决方案是用莎士比亚的语言配置你的MySQL:

  • 找到MySQL配置文件“my.ini”
  • 搜索“lc-messages”属性并将值替换为“en_US”

相关问题