AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 209397
Accepted
BrainStone
BrainStone
Asked: 2018-06-13 04:32:03 +0800 CST2018-06-13 04:32:03 +0800 CST 2018-06-13 04:32:03 +0800 CST

Aumentar manualmente a coluna AUTO_INCREMENT em um

  • 772

Eu queria saber se existe uma maneira simples de aumentar manualmente o valor de incremento automático de uma coluna MySQL em um.

O caso de uso seria manter os índices sincronizados de duas tabelas. No meu caso, eles geralmente recebem uma nova entrada ao mesmo tempo. Mas às vezes apenas um deles recebe uma nova entrada. Isso faz com que os IDs sejam dessincronizados, o que não é o que eu quero. Devido a limitações no código, não consigo recuperar o ID de nenhuma linha inserida, pois há uma quantidade razoável de limitações na API que uso para me comunicar com o banco de dados. No entanto, posso executar consultas para o conteúdo do meu coração. Portanto, uma simples consulta para aumentar o valor em um seria muito apreciada!

mysql auto-increment
  • 1 1 respostas
  • 2486 Views

1 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2018-06-13T05:40:20+08:002018-06-13T05:40:20+08:00

    Não faço promessas com este, mas você pode se safar com o seguinte:

    Para uma tabela mytableno banco de mydbdados

    SET @src_db = 'mydb';
    SET @src_tb = 'mytable';
    SELECT CONCAT('ALTER TABLE ',@src_db,'.',@src_tb,' AUTO_INCREMENT=',auto_increment+1)
    INTO @sql FROM information_schema.tables
    WHERE table_schema=@src_db AND table_name=@src_tb;
    PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
    

    Depois de executar isso, você pode verificar com

    SHOW CREATE TABLE mydb.mytable\G
    

    Acabei de tentar isso com uma mesa ganeshbora.customerno meu laptop Windows (5.7.12)

    CÓDIGO DE AMOSTRA

    SET @src_db = 'ganeshbora';
    SET @src_tb = 'customer';
    SHOW CREATE TABLE ganeshbora.customer\G
    SELECT CONCAT('ALTER TABLE ',@src_db,'.',@src_tb,' AUTO_INCREMENT=',auto_increment+1)
    INTO @sql FROM information_schema.tables
    WHERE table_schema=@src_db AND table_name=@src_tb;
    SELECT @sql;
    PREPARE s FROM @sql;
    EXECUTE s;
    DEALLOCATE PREPARE s;
    SHOW CREATE TABLE ganeshbora.customer\G
    

    CÓDIGO DE AMOSTRA EXECUTADO

    mysql> SET @src_db = 'ganeshbora';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SET @src_tb = 'customer';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SHOW CREATE TABLE ganeshbora.customer\G
    *************************** 1. row ***************************
           Table: customer
    Create Table: CREATE TABLE `customer` (
      `cust_id` int(11) NOT NULL AUTO_INCREMENT,
      `firstname` varchar(20) DEFAULT NULL,
      `lastname` varchar(20) DEFAULT NULL,
      `address` varchar(40) DEFAULT NULL,
      PRIMARY KEY (`cust_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    
    mysql> SELECT CONCAT('ALTER TABLE ',@src_db,'.',@src_tb,' AUTO_INCREMENT=',auto_increment+1)
        -> INTO @sql FROM information_schema.tables
        -> WHERE table_schema=@src_db AND table_name=@src_tb;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT @sql;
    +---------------------------------------------------+
    | @sql                                              |
    +---------------------------------------------------+
    | ALTER TABLE ganeshbora.customer AUTO_INCREMENT=15 |
    +---------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> PREPARE s FROM @sql;
    Query OK, 0 rows affected (0.00 sec)
    Statement prepared
    
    mysql> EXECUTE s;
    Query OK, 0 rows affected (0.06 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> DEALLOCATE PREPARE s;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SHOW CREATE TABLE ganeshbora.customer\G
    *************************** 1. row ***************************
           Table: customer
    Create Table: CREATE TABLE `customer` (
      `cust_id` int(11) NOT NULL AUTO_INCREMENT,
      `firstname` varchar(20) DEFAULT NULL,
      `lastname` varchar(20) DEFAULT NULL,
      `address` varchar(40) DEFAULT NULL,
      PRIMARY KEY (`cust_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    
    mysql>
    

    Conforme mostrado, o auto_increment da tabela foi incrementado de 14para 15. Claro, eu fiz isso com todos os privilégios:

    mysql> SELECT user(),current_user();
    +---------------------------+---------------------------+
    | user()                    | current_user()            |
    +---------------------------+---------------------------+
    | rolandomysqldba@localhost | rolandomysqldba@localhost |
    +---------------------------+---------------------------+
    1 row in set (0.00 sec)
    
    mysql> SHOW GRANTS;
    +--------------------------------------------------------------------------------+
    | Grants for rolandomysqldba@localhost                                           |
    +--------------------------------------------------------------------------------+
    | GRANT ALL PRIVILEGES ON *.* TO 'rolandomysqldba'@'localhost' WITH GRANT OPTION |
    +--------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql>
    

    Então, se você tiver os subsídios necessários para fazer isso ...

    DE UMA CHANCE !!!

    ATUALIZAÇÃO 2018-06-12 14:57 EDT

    Um comentário de JohnathanFite traz um ponto válido:

    Como isso será seguro para vários usuários ao mesmo tempo? Eu posso ver usá-lo para corrigi-lo quando estiver fora de sincronia, mas pelo menos avisar o OP que executar isso em um ambiente multiusuário causará problemas

    Embora esta resposta conserte o AUTO_INCREMENT em um mundo perfeito, não vivemos em um mundo perfeito. Você precisaria de um tempo de inatividade do aplicativo (1-2 min) para congelar as gravações e os valores atuais de auto_increment. Se você tentar minha resposta em um sistema ativo, poderá estragar rapidamente os valores de auto_increment porque as reversões de INSERTs em uma tabela com valores de auto_increment produzirão lacunas. Em muitos casos, o incremento de folga pode ser maior que 1 devido a inserções em massa que revertem.

    Por favor, leia meu post antigo de May 12, 2015: A coluna de incremento automático do MySQL aumenta após o erro de inserção ocorrer para ver como as lacunas de auto_increment são geradas.

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve