Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果两列不存在,则插入到表中_Java_Mysql - Fatal编程技术网

Java 如果两列不存在,则插入到表中

Java 如果两列不存在,则插入到表中,java,mysql,Java,Mysql,下面是我现在使用的代码,它给出了一个MySQL语法错误: UUID uuid = player.getUniqueId(); long uuid_m = uuid.getMostSignificantBits(), uuid_l = uuid.getLeastSignificantBits(); String query = String.format( "INSERT INTO players (uuid_m, uuid_l, name, clan, x

下面是我现在使用的代码,它给出了一个MySQL语法错误:

UUID uuid = player.getUniqueId();
    long uuid_m = uuid.getMostSignificantBits(), uuid_l = uuid.getLeastSignificantBits();
    String query = String.format(
            "INSERT INTO players (uuid_m, uuid_l, name, clan, xp, rank)" +
                    "SELECT * FROM SELECT CONCAT('%d', '%d', '%s', '%s', '%d', '%d') AS tmp" +
                    "WHERE NOT EXISTS (SELECT CONCAT(uuid_m, uuid_l) FROM players WHERE uuid_m = '%d' AND uuid_l = '%d')" +
                    "LIMIT 1;", uuid_m, uuid_l, player.getName(), "TestClan", 0, 0, uuid_m, uuid_l);

我用Java编写了代码,但我试着让它尽可能可读,我不认为代码中有任何特定于Java本身的东西。我数据库中的表名为players,它有uuid_m long、uuid_l long、varchar50 name、varchar50 clan、xp int、rank int列。我考虑过只使用varchar32而不是将uuid一分为二,但我做了一些计算,这将占用4倍的空间。我是MySQL的新手,但我想尝试保持一切高效

首先,SELECT*FROM SELECT是多余的,即使它可以工作,我对此表示怀疑。其次,您试图将n列插入表中,但只传递1-CONCAT将把值连接到1列中。您需要删除concat并提供完整的值列表,以插入到玩家存在和不存在的两个选择中

您有几个问题

在每条折线的末尾缺少空格。比如说

"INSERT INTO players (uuid_m, uuid_l, name, clan, xp, rank)" +
                                                           ^
"SELECT CONCAT('%d', '%d', '%s', '%s', '%d', '%d') AS tmp" +
                                                         ^
"WHERE NOT EXISTS (SELECT CONCAT(uuid_m, uuid_l) FROM players WHERE uuid_m = '%d' AND uuid_l = '%d')" +
                                                                                                    ^
"LIMIT 1;"
在所有这些情况下,下一行立即开始,因此您得到,例如,…作为TMPWHERE。。。你需要包括空间

在FROM之前有WHERE子句

您正在动态地构建查询并插入可能受污染的值,从而使自己极易受到SQL注入攻击。使用带替换点的PreparedStatement。 可能还有更多,但您应该在继续之前解决这些问题


诊断SQL语法错误时,请始终打印程序生成的最终语句,以查看传递给驱动程序的内容。

这种方法不是必需的,实际上可能有害。最简单的解决方案是将UUID指定为主键,并使用它来完成:

INSERT INTO players (uuid, name, clan, xp, rank)
  VALUES (?, ?, ?, ?, ?)
这是照本宣科的,而且行之有效。如果有重复记录,则插入将失败。如果要更新现有记录,可以编写更新。。。其中uuid=?或者使用MySQL功能,即在其他数据库中的upsert:

INSERT INTO players (uuid, name, clan, xp, rank)
  VALUES (?, ?, ?, ?, ?)
  ON DUPLICATE KEY SET name=VALUES(name), clan=VALUES(clan), xp=VALUES(xp), rank=VALUES(rank)
这样,您甚至不必费心测试条目是否已经存在。如果它存在,它将用你手头上的任何新数据进行更新

关于UUID字段:

在存储方面,32个字符与8个字符的边际成本将使您破产,您要处理几十亿行?不要太聪明,将UUID存储为二进制数据,特别是当您将其放在两个不同的列中时。这就是你如何在一个团队中赢得坏名声的原因,因为你制作了所有人都不喜欢使用的可笑的巴洛克式数据结构。将其存储为十六进制编码的文本,并像其他人一样显示破折号。如果您的数据库平台支持本机UUID类型(如Postgres),请改用该类型,但前提是

a也是128位,所以需要两个BIGINT值,最小值,或者换句话说是16字节。我认为您没有意识到每行额外增加16个字节与单个列提供的即时、易于阅读和简单索引优势相比是多么微不足道


我们生活在一个只有千兆字节存储空间的驱动器被认为很小,内存同样丰富的时代。我们不需要从数据结构中挤出每一点。这是一个典型的过早优化案例。用传统的方法来做,直到你有具体的证据证明这种方法在你的特定情况下不起作用,然后测量问题的影响,这样当您尝试替代方案时,您可以看到它们相对于基线的表现。

这里有什么问题?@Ashasrivastava我收到一个MySQL代码错误,表示存在语法错误。尝试在MySQL中启动相同的查询,并检查是否有效。可能存在重复的。另外:我考虑过使用varchar32而不是将UUID一分为二,但是我做了一些计算,这将占用4倍的空间。这太荒谬了!!!!如果您的列需要varchar32。。。然后定义一个varchar32!PS:语法错误。。。是因为您的insert语句是非法的…警告:这有一些严重的错误,因为这些值不是。不要使用String.format编写这样的查询。另外,第二行和第三行将连接在一起,命名为tmpWHERE。非常感谢!我将改变存储UUID的糟糕方式,只需使用varchar32,然后lol