programing

SELECT MAX('Id')를 테이블에서 setval()로 전달합니다.

prostudy 2022. 9. 13. 21:34
반응형

SELECT MAX('Id')를 테이블에서 setval()로 전달합니다.

합격하고 싶다(SELECT MAX).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를 사용하고 있었는데 작동하지 않습니다.

편집 코멘트에서 말씀드린 것처럼 엔티티 프레임워크 핵심 이행에서 이 작업을 한 번만 수행하려고 합니다.내가 끝낸 것은 그 일을 실행한 것이다.SELECT MAX(Id) FROM Table이행 코드로부터 그 값을 회복해, 나중에 그 값을 보간한다.$"SELECT setval('sequence', {value}, true)"

준비된 스테이트먼트를 사용하여 회피책을 찾았습니다.

SET @max_value = (SELECT MAX(`Id`) FROM `Table`);
EXECUTE IMMEDIATE CONCAT('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`;

스탠드아론 스테이트먼트(쿼리가 아님)에서는 일반적으로 사용자 정의 변수에 값을 할당하기 위해 사용됩니다.대신 다음을 시도해 보십시오.

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

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();
        }
    }
}

내가 원하는 만큼 깨끗하진 않지만, 일을 해낼 수 있어.

나중에 사용SETVALc# 코드에서 sql 문자열의 값을 다시 보간합니다.

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

또한, 이 모든 것이Up()데이터베이스에 도달하기 전에 실행되는 코드, 즉SELECT MAX(Id) FROM Table;이행이 데이터베이스 조작을 개시하기 전에 필요한 값을 얻을 필요가 있습니다.

언급URL : https://stackoverflow.com/questions/57124881/pass-select-maxid-from-table-to-setval

반응형