【问题标题】:Populating a many - many doesn't populate, and throws no errors填充 many - many 不会填充,并且不会引发错误
【发布时间】:2020-07-20 12:41:12
【问题描述】:

我的数据库如下所示:

表:公会 -> guild_id、guild_name、guild_owner、guild_owner_id、guild_member_count、guild_prefix。

表:成员 -> member_id、member_name、member_disc

表:公会成员 -> guild_id、member_id、warning_points、chat_points

所以guild_idmember_id 是来自 Discord 的值,并且都是 PK。我的目标是专门将每个成员绑定到一个公会,添加warning_pointschat_points

我可以同时填充Guilds 表和Members 表,但是它不会使用相关数据自动填充Guildmembers 表。

尝试使用此代码填充表格时:

let guiMemSQL = 'INSERT INTO Guildmembers(guild_id, member_id) SELECT Guilds.guild_id, Members.member_id FROM Guilds INNER JOIN Members ON Guilds.guild_id = Members.member_id'
con.query(guiMemSQL, (err, result) => {
    if(err){ throw err }
    console.log(`Updated GuildMembers Table`);
})

我没有收到任何错误。该表也不填充。所以要么我的代码/逻辑有缺陷,要么我不明白我在做什么。

我要获取的信息是guild_idmember_id,它们是BIGINTs。

【问题讨论】:

  • 我不使用 MySQL,但我认为 BIGINT 不适用于 guild_idmember_id,当在您的代码中使用时,您总是需要将它们作为字符串传递,所以为什么将它们存储为数字?
  • 如果您只是对您的数据库执行SELECT,它会返回您期望的结果吗?

标签: javascript mysql node.js discord.js


【解决方案1】:

mysql 不会自动填充多对多表,您必须像处理任何其他表一样INSERT 值。我这样做的方法是使用以下代码:

// Update GuildMembers Table
let guiID = MemberInfo.userGuildID;
const memGuiID = BigInt(guiID); // Convert String to Number
const updGMT = {guild_id: memGuiID, member_id: memIdNo };
let guiMemSQL = 'INSERT INTO Guildmembers SET ?';
con.query(guiMemSQL, updGMT, (err, result) => {
    if(err){ throw err }
    console.log(`Updated GuildMembers Table`);
})

这里的参数化查询用例虽然不是特定问题,但对于帮助抵御sql injection 攻击的风险很重要。并且会被视为很好的做法。

如果有人知道让字段自动填充的方法,请分享!

目前我将留下我为解决此问题所做的工作,以防其他人遇到类似问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2018-08-23
    • 1970-01-01
    • 2019-08-10
    相关资源
    最近更新 更多