0

所以我想将一个用户发送到一个mysql数据库的列:用户、技能、时间现在,我希望它能够为同一个用户添加多行但有不同的时间等等,我该怎么做? 这是我将其发送到数据库的代码:

   public static boolean recentActivity(Player paramPlayer){
    try {
        Statement statement = con.createStatement();
        ResultSet group = statement.executeQuery("SELECT * FROM recentactivity WHERE user = '"+ paramPlayer.getDisplayName() + "'");
        if (!group.next() && !paramPlayer.levelTime.equals(""))
                statement.execute("INSERT INTO `recentactivity`(`user`, `skill`, `time`) VALUES('"+ paramPlayer.getDisplayName() +"', '"+ paramPlayer.levelledSkill +"', '"+ paramPlayer.levelTime +"')");
    } catch (Exception localException) {
        return false;
    }
    return true;

然后我有这个使用它:

    java.util.Date dt = new java.util.Date();
    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("dd-MMM-yyyy HH:mm:ss");
    String currentTime = sdf.format(dt);
    player.levelledSkill = skill;
    player.levelTime = ""+currentTime+"";
    Hiscores.recentActivity(player);

有什么帮助吗?

架构:

CREATE TABLE IF NOT EXISTS recentactivity ( 
    user varchar(255) NOT NULL
    , skill int(11) NOT NULL
    , time varchar(255) NOT NULL
    , PRIMARY KEY (user) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
4

3 回答 3

1

文档中:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...
    [ ON DUPLICATE KEY UPDATE
        col_name=expr
            [, col_name=expr] ... ]

所以,忽略你不使用的东西......

INSERT INTO tbl_name (col_name,...)
    VALUES | VALUE (expr,...),(...),...

只需添加一个逗号和一组新的括号,您就可以添加额外的记录,令人作呕。例如:

"INSERT INTO `recentactivity`(`user`, `skill`, `time`) 
    VALUES('"+ paramPlayer.getDisplayName() +"', '"+ paramPlayer.levelledSkill +"', '"+ paramPlayer.levelTime +"')" 
    + ",('"+ paramPlayer2.getDisplayName() +"', '"+ paramPlayer2.levelledSkill +"', '"+ paramPlayer2.levelTime +"')"

或者,您可以使用 StringBuilder 或任何数量的东西来迭代循环。

于 2012-08-27T22:21:42.420 回答
0

IIUC 您想为同一用户添加多行。

但是,您的代码中有两个地方阻止您这样做。

第一部分是在 java 中:

如果 (!group.next()

它搜索该用户是否已经存在一行,只有在没有时才执行 INSERT。

但是,该代码可以防止发生 SQL 异常。在您的 SQL 模式中,用户是表的主键,因此您不能使用同一用户插入两行。

您应该更改这两个位置(删除主键,删除 !group.next),但首先检查应用程序的其余部分是否仍然可以处理与同一用户相关的多行,因为它似乎被设计为防止这种情况多于允许它。

于 2012-08-27T22:23:31.323 回答
0

我认为如果您关闭 AutoCommit 可以做到这一点。

自动提交模式意味着当一个语句完成时,该语句上的方法 commit 会被自动调用。自动提交实际上使每个 SQL 语句成为事务。提交发生在语句完成或执行下一条语句时,以先到者为准。对于返回 ResultSet 的语句,当检索到 ResultSet 的最后一行或显式关闭 ResultSet 时,该语句完成。

因此,在创建 ResultSet 的实例后,请编写以下内容:

group.AutoCommit(False);

在 AutoCommit 之后编写 SQL 插入语句

完成后,并希望将它们作为一个块调用放入数据库

group.commit();

关于使用 AutoCommit 的示例

于 2012-08-27T22:37:39.250 回答