Передайте SELECT MAX(`Id`) из таблицы в setval()
Я хочу пройти (ВЫБЕРИТЕ МАКС (Id
) ИЗ Table
к Мариадб setval()
функция, которую я пробовал с:
SELECT setval(`MySequence`, (SELECT MAX(`Id`) FROM `Table`));
но это не работает, я также попытался:
SET @max_value = (SELECT MAX(`Id`) FROM `Table`);
SELECT setval(`MySequence`, @max_value);
как я должен это сделать?
РЕДАКТИРОВАТЬ Я сделал ошибку, разместив вопрос. Я использовал SET на второй код и не работает
РЕДАКТИРОВАТЬ Как я уже говорил в комментариях, я пытаюсь сделать это только один раз, начиная с миграции Entity Framework Core. То, что я закончил делать это выполнение SELECT MAX(Id) FROM Table
и восстановить это значение из кода миграции, чтобы интерполировать его позже на $"SELECT setval('sequence', {value}, true)"
4 ответа
В select
использовать :=
назначить переменные:
SELECT @max_value := MAX(`Id`) FROM `Table`;
SELECT setval(`MySequence`, @max_value);
Вы можете добавить 1 к значению.
Я думаю, что вы можете сделать:
SELECT setval(`MySequence`, MAX(Id))
FROM `Table`;
Я нашел обходной путь, используя подготовленный оператор :
SET @max_value = (SELECT MAX(`Id`) FROM `Table`);
EXECUTE IMMEDIATE CONCAT('SELECT SETVAL(`MySequence`, ', @max_value, ')');
В отдельном выражении (не в запросе) SET
обычно используется для присвоения значения пользовательской переменной. Попробуйте следующее:
SET @max_value = (SELECT MAX(`Id`) FROM `Table`);
SELECT setval(`MySequence`, @max_value);
Кажется, что это невозможно сделать с MariaDB 10.3.16
Я поднял ошибку на https://jira.mariadb.org/browse/MDEV-20111 для разработчиков, чтобы рассмотреть возможность добавления этой функции или обновления документации, чтобы сделать явным, что это невозможно сделать.
Я работал вокруг этого, выбрав значение с помощью Mysqlconnector в коде C#
private long ReadMaxIdFromTable()
{
MySqlConnection connection = null;
try
{
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var builder = new ConfigurationBuilder();
var builderenv = builder.AddJsonFile("config/appsettings.json", optional: false, reloadOnChange: false)
.AddJsonFile($"config/appsettings.{environment}.json", false, false).AddEnvironmentVariables();
IConfigurationRoot configuration = builderenv.Build();
var connectionString = configuration.GetConnectionString("ConnectionStringName");
connection = new MySqlConnection(connectionString);
connection.Open();
var cmd = connection.CreateCommand() as MySqlCommand;
cmd.CommandText = @"SELECT MAX(`Id`) FROM `Table`";
var result = (long)cmd.ExecuteScalar();
return result;
}
catch (Exception)
{
throw;
}
finally
{
if (connection != null && connection.State != System.Data.ConnectionState.Closed)
{
connection.Close();
}
}
}
Не так чисто, как мне хотелось бы, но он выполняет свою работу.
Позже я использую SETVAL
интерполировать значение в строке SQL снова из кода C#.
var currentSeq = ReadMaxIdFromTable();
migrationBuilder.Sql($"SELECT SETVAL(`MySequence`, {currentSeq}, true);");
Кроме того, будьте осторожны, что все Up()
код выполняется до того, как что-нибудь попадет в базу данных, это означает, что SELECT MAX(Id) FROM Table;
должен привести к значению, которое мы ищем, прежде чем миграция начнет манипулировать базой данных.