我想从Id
传递(SELECT MAX(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)"
答案 0 :(得分:1)
在独立语句(不是查询)中,SET
通常用于将值分配给用户定义的变量。请尝试以下操作:
SET @max_value = (SELECT MAX(`Id`) FROM `Table`);
SELECT setval(`MySequence`, @max_value);
答案 1 :(得分:1)
在select
中,使用:=
分配变量:
SELECT @max_value := MAX(`Id`) FROM `Table`;
SELECT setval(`MySequence`, @max_value);
您可能想在值上加1。
我认为您可以做到:
SELECT setval(`MySequence`, MAX(Id))
FROM `Table`;
答案 2 :(得分: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;
必须在迁移开始处理数据库之前产生我们要查找的值。