1

我想将 (SELECT MAX( Id) FROM传递给我尝试过Table的 mariadb函数: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

4 回答 4

2

在 aselect中,用于:=分配变量:

SELECT @max_value := MAX(`Id`) FROM `Table`;
SELECT setval(`MySequence`, @max_value);

您可能希望将该值加 1。

我认为你可以这样做:

SELECT setval(`MySequence`, MAX(Id))
FROM `Table`;
于 2019-07-20T13:02:49.793 回答
1

我找到了使用准备好的语句的解决方法:

SET @max_value = (SELECT MAX(`Id`) FROM `Table`);
EXECUTE IMMEDIATE CONCAT('SELECT SETVAL(`MySequence`, ', @max_value, ')');
于 2021-12-02T15:38:38.283 回答
1

在一个独立的语句(不是一个查询)中,SET一般用来给一个用户定义的变量赋值。请尝试以下操作:

SET @max_value = (SELECT MAX(`Id`) FROM `Table`);
SELECT setval(`MySequence`, @max_value);
于 2019-07-20T13:02:08.437 回答
0

从MariaDB 10.3.16 开始似乎不可能做到这一点

我在https://jira.mariadb.org/browse/MDEV-20111上提出了一个错误,供开发人员考虑添加此功能或升级文档以明确表示无法完成。

我通过在 c# 代码中使用 Mysqlconnector 选择值来解决这个问题

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再次从 c# 代码中使用插值 sql 字符串中的值。

 var currentSeq = ReadMaxIdFromTable();
 migrationBuilder.Sql($"SELECT SETVAL(`MySequence`, {currentSeq}, true);");

此外,请注意Up()它在任何内容到达数据库之前执行的所有代码,这意味着SELECT MAX(Id) FROM Table;必须在迁移开始操作数据库之前产生我们正在寻找的值。

于 2019-07-21T12:53:31.450 回答