Передайте 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; должен привести к значению, которое мы ищем, прежде чем миграция начнет манипулировать базой данных.

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