Mysql 继续选择id而不是外键

Mysql 继续选择id而不是外键,mysql,sequelize.js,graphql,Mysql,Sequelize.js,Graphql,我有一个Book表、一个Category表和一个名为BookCategories的联接表。这是一个过于简化的结构: books { id, name, hash // unique } categories { id, name } book_categories { id, book_hash, category_id } 由于应用程序的工作方式,决定在联接表中使用book\u散列,而不是book\u id 以下是三个表之间的续集关系: // book B

我有一个
Book
表、一个
Category
表和一个名为
BookCategories
的联接表。这是一个过于简化的结构:

books {
  id,
  name,
  hash // unique
}

categories {
  id,
  name
}

book_categories {
  id,
  book_hash,
  category_id
}
由于应用程序的工作方式,决定在联接表中使用
book\u散列
,而不是
book\u id

以下是三个表之间的续集关系:

// book
Book.hasMany(models.bookCategories, { foreignKey: 'book_hash' });

// category
Category.hasMany(models.bookCategories, { foreignKey: 'category_id' });

// bookCategories
BookCategories.belongsTo(models.book, { foreignKey: 'collection_hash' });
BookCategories.belongsTo(models.category, { foreignKey: 'category_id' });
我将Sequelize与GraphQL一起使用,因此在
CategoryType
上创建
books
字段时,一切都很好:

books: {
  type: new GraphQLList(BookType),
  args: defaultListArgs(),
  async resolve(f, args) {
    return await f.getBookCategories(args);
    // normally doesn't return, uses results to get book hashes and return books
  }
}
它运行以下查询:

SELECT `id`, `name` FROM `categories` ASC;
SELECT `id`, `book_hash`, `category_id` FROM `book_categories` AS `bookCategories` WHERE `bookCategories`.`category_id` IN (1, 2, 3, 4, 5);
但当以另一种方式通过
图书类型
请求图书类别时,它不会:

categories: {
  type: new GraphQLList(CategoryType),
  args: defaultListArgs(),
  async resolve(f, args) {
    return await f.getBookCategories(args);
    // normally doesn't return, uses results to get category ids and return categories
  }
}
它运行以下查询:

SELECT `id`, `name`, `hash`,  FROM `books` AS `book` WHERE `book`.`hash` = 'ft3qvqlj';
SELECT `id`, `book_hash`, `category_id` FROM `book_categories` AS `bookCategories` WHERE `bookCategories`.`book_hash` IN (93586);
如您所见,即使我将外键设置为两个关系上的哈希,它仍然使用book id进行查询。这与
hash
不是
books
表上的主键有关吗


是否有办法解决此问题,或者我必须重做数据库结构?

如果不将任何列声明为主键,sequelize将假定book id为主键。并将其用于关联查询。另外,您可能需要使用1.7.X版来执行soI did声明
id
作为books表中的主键。为什么它认为即使我将散列指定为外键,我也要使用
id
?是的,问题是必须有一个主键被其他表用作外键,您必须将散列作为主键