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 / 6547
Accepted
Josh
Josh
Asked: 2011-10-06 12:45:29 +0800 CST2011-10-06 12:45:29 +0800 CST 2011-10-06 12:45:29 +0800 CST

Posso renomear os valores em uma coluna MySQL ENUM em uma consulta?

  • 772

Suponha que eu tenha uma tabela de banco de dados com um arquivo ENUM('value_one','value_two'). Eu quero mudar isso para um arquivo ENUM('First value','Second value'). Atualmente estou fazendo isso da seguinte forma:

ALTER TABLE `table` MODIFY `column` ENUM('value_one','value_two','First value','Second value');
UPDATE `table` SET `column`='First Value' WHERE `column`='value_one';
UPDATE `table` SET `column`='Second Value' WHERE `column`='value_two';
ALTER TABLE `table` MODIFY `column` ENUM('First value','Second value');

Existe uma maneira mais eficiente de fazer isso, por exemplo, uma maneira de fazer isso com uma única ALTER TABLE instrução?

mysql alter-table
  • 2 2 respostas
  • 14716 Views

2 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-10-06T13:20:12+08:002011-10-06T13:20:12+08:00

    A técnica a seguir que estou prestes a mostrar exigirá coragem de aço.

    Dados os seguintes critérios

    • datadir é/var/lib/mysql
    • mesa émydb.mytb
    • coluna enum chamada é chamadaenum_col
    • motor é MyISAM

    Aqui está uma rachadura que desafia a morte:

    1. CREATE TABLE mydb.mybt LIKE mydb.mytb;

    2. ALTER TABLE mydb.mybt MODIFY enum_col ENUM('First value','Second value');

    3. SET wait_timeout=86400; SET interactive_timeout=86400;

    4. FLUSH TABLES WITH READ LOCK;

    5. Em uma sessão OS/SSH separada, troque os arquivos .frm

      • $ mv /var/lib/mysql/mydb/mytb.frm /var/lib/mysql/mydb/myxx.frm
      • $ mv /var/lib/mysql/mydb/mybt.frm /var/lib/mysql/mydb/mytb.frm
      • $ mv /var/lib/mysql/mydb/myxx.frm /var/lib/mysql/mydb/mybt.frm
    6. UNLOCK TABLES;

    7. DROP TABLE mydb.mybt;

    É isso !!!

    AVISO: NÃO POSSO TOMAR CRÉDITO POR ISSO!

    Esta técnica vem de "MySQL de alto desempenho: otimização, backups, replicação e mais", páginas 146-148 sob o subtítulo Acelerando ALTER TABLE . Página 147 O parágrafo 1 diz:

    A técnica que estamos prestes a demonstrar não tem suporte, não é documentada e pode não funcionar. Use-o por sua conta e risco. Aconselhamos você a fazer backup de seus dados primeiro!

    De uma chance ! (Por favor, deixe-nos saber como ficou)

    ATUALIZAÇÃO 2011-10-05 17:49 EDT

    Se a tabela for MyISAM e você tiver espaço suficiente na produção e uma janela de tempo de inatividade direta, tente o seguinte:

    1. service mysql restart --skip-networking

    2. Em uma sessão OS/SSH separada, faça uma cópia da tabela

      • cp /var/lib/mysql/mydb/mytb.frm /var/lib/mysql/mydb/mytbplay.frm
      • cp /var/lib/mysql/mydb/mytb.MYD /var/lib/mysql/mydb/mytbplay.MYD
      • cp /var/lib/mysql/mydb/mytb.MYI /var/lib/mysql/mydb/mytbplay.MYI

    INFORMATION_SCHEMA.TABLESdetectará automaticamente a presença da nova tabela chamada mydb.mytbplay.

    1. Execute o algoritmo de coragem de aço emmydb.mytbplay

    2. Você testa a integridade demydb.mytbplay

    Se você está satisfeito

    1. ALTER TABLE mydb.mytb RENAME mydb.mytb_backup;

    2. ALTER TABLE mydb.mytbplay RENAME mydb.mytb;

    3. service mysql restart

    De uma chance!

    • 10
  2. Abdelkader Mh
    2018-11-07T09:02:41+08:002018-11-07T09:02:41+08:00

    Uma solução simples seria:

    1- adicione uma nova coluna:

    ALTER TABLE `table` ADD `enum2` ENUM('First value', 'Second value') NOT NULL AFTER `enum`;

    2- Copie o valor da coluna para enum2 com substituições:

    UPDATE `table` SET enum2=REPLACE(`column`, "value_one", "new value")

    3- Solte a coluna column, renomeie enumpara column.

    NOTA : esta questão volta para 2011-10-05, minha solução é válida para MYSQL 4.1 e mais recente (AFAIK)

    • 5

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

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

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

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

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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