Как мне использовать это, если еще в запросе MySql?

Итак, у меня есть этот код ниже (на Java), который использует 1 запрос, чтобы проверить, содержит ли таблица регистр с UUID плеера и ТОЛЬКО после того, как mysql отправил результат, он может решить использовать UPDATE или INSERT в ДРУГОМ запросе.,

// Assuming that I have variables like these:
// String uid = "ffffffff-ffff-ffff-ffff-ffffffffffff"; // This is a Minecraft UUID.
// int languageID = 1; // This is a simple Integer
ResultSet set = stm.executeQuery("SELECT language FROM players WHERE UUID = '" + uid + "';");
set.beforeFirst();
while (set.next()){
    // This will run if in the table already contains the UUID = the uid.
    stm.execute("UPDATE players SET language = '" + languageID + "' WHERE UUID = '" + uid +"';");
    return;
}
// This will just run if the resultSet is empty.
stm.execute("INSERT INTO players(UUID, language) values('" + uid + "','" + languageID +"')");

Мне нужно превратить этот код в один запрос MySQL, чтобы избежать LAG на сервере, потому что этот код будет выполняться каждый раз, когда кто-то присоединяется к моему серверу BungeeCord. Хотя этот код находится в асинхронной задаче, он все же может вызвать некоторые проблемы.

Дело в том, что я не знаю, как использовать функцию IF в sql, чтобы проверить, содержит ли таблица регистр с UUID проигрывателя:

IF (/* HERE IS THE PROBLEM */) THEN {
   UPDATE players SET ... WHERE ... // update the result
}
ELSE {
  INSERT INTO players ... // insert a new register in the table
}

Благодарю.

1 ответ

Решение

Ты хочешь insert . . . on duplicate key update, Что-то вроде этого:

INSERT INTO players(UUID, language)
     VALUES (uid, languageID)
     ON DUPLICATE KEY UPDATE language = VALUES(language);

Обратите внимание, что даже перемещение IF в базу данных (в хранимой процедуре) не устраняет состояние гонки. Единственный способ сделать это - заблокировать таблицу для обновления. Но вы можете сделать все это в одном утверждении, так что это лучший подход.

Кроме того, это предполагает, что у вас есть уникальный индекс или первичный ключ в таблице для идентификации дубликатов.

Другие вопросы по тегам