将 SELECT MAX(`Id`) FROM Table 传递给 setval()
Pass SELECT MAX(`Id`) FROM Table to setval()
我想将 (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);
我该怎么做?
EDIT 我发错问题了。我在第二个代码上使用了 SET 但没有工作
编辑 正如我在评论中所说的那样,我试图只执行一次,从 Entity Framework 核心迁移执行。我最后做的是执行 SELECT MAX(Id) FROM Table
并从迁移代码中恢复该值,以便稍后在 $"SELECT setval('sequence', {value}, true)"
上插入它
在stand-alone语句(不是查询)中,SET
通常用于赋值到 user-defined 变量。请尝试以下操作:
SET @max_value = (SELECT MAX(`Id`) FROM `Table`);
SELECT setval(`MySequence`, @max_value);
在一个select
中,使用:=
赋值变量:
SELECT @max_value := MAX(`Id`) FROM `Table`;
SELECT setval(`MySequence`, @max_value);
您可能希望将值加 1。
我认为你可以做到:
SELECT setval(`MySequence`, MAX(Id))
FROM `Table`;
从 MariaDB 10.3.16
开始似乎无法执行此操作
我在 https://jira.mariadb.org/browse/MDEV-20111 上提出了一个错误,供开发人员考虑添加此功能或升级文档以明确表示无法完成。
我通过使用 C# 代码中的 Mysql 连接器选择值来解决这个问题
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;
必须在迁移开始操作之前生成我们正在寻找的值数据库。
我找到了使用 prepared statement:
的解决方法
SET @max_value = (SELECT MAX(`Id`) FROM `Table`);
EXECUTE IMMEDIATE CONCAT('SELECT SETVAL(`MySequence`, ', @max_value, ')');
我想将 (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);
我该怎么做?
EDIT 我发错问题了。我在第二个代码上使用了 SET 但没有工作
编辑 正如我在评论中所说的那样,我试图只执行一次,从 Entity Framework 核心迁移执行。我最后做的是执行 SELECT MAX(Id) FROM Table
并从迁移代码中恢复该值,以便稍后在 $"SELECT setval('sequence', {value}, true)"
在stand-alone语句(不是查询)中,SET
通常用于赋值到 user-defined 变量。请尝试以下操作:
SET @max_value = (SELECT MAX(`Id`) FROM `Table`);
SELECT setval(`MySequence`, @max_value);
在一个select
中,使用:=
赋值变量:
SELECT @max_value := MAX(`Id`) FROM `Table`;
SELECT setval(`MySequence`, @max_value);
您可能希望将值加 1。
我认为你可以做到:
SELECT setval(`MySequence`, MAX(Id))
FROM `Table`;
从 MariaDB 10.3.16
开始似乎无法执行此操作我在 https://jira.mariadb.org/browse/MDEV-20111 上提出了一个错误,供开发人员考虑添加此功能或升级文档以明确表示无法完成。
我通过使用 C# 代码中的 Mysql 连接器选择值来解决这个问题
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;
必须在迁移开始操作之前生成我们正在寻找的值数据库。
我找到了使用 prepared statement:
的解决方法SET @max_value = (SELECT MAX(`Id`) FROM `Table`);
EXECUTE IMMEDIATE CONCAT('SELECT SETVAL(`MySequence`, ', @max_value, ')');