table - update field enum mysql




Como eu adiciono mais membros à minha coluna do tipo ENUM no MySQL? (5)

É possível se você acredita. Ele Ele. tente este código.

public function add_new_enum($new_value)
  {
    $table="product";
    $column="category";
         $row = $this->db->query("SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = ? AND COLUMN_NAME = ?", array($table, $column))->row_array();

    $old_category = array();
    $new_category="";
    foreach (explode(',', str_replace("'", '', substr($row['COLUMN_TYPE'], 5, (strlen($row['COLUMN_TYPE']) - 6)))) as $val)
    {
        //getting the old category first

        $old_category[$val] = $val;
        $new_category.="'".$old_category[$val]."'".",";
    }

     //after the end of foreach, add the $new_value to $new_category

      $new_category.="'".$new_value."'";

    //Then alter the table column with the new enum

    $this->db->query("ALTER TABLE product CHANGE category category ENUM($new_category)");
  }

Antes de adicionar novo valor

Depois de adicionar novo valor

O manual de referência do MySQL não fornece um exemplo claro sobre como fazer isso.

Eu tenho uma coluna do tipo ENUM de nomes de países para os quais preciso adicionar mais países. Qual é a sintaxe correta do MySQL para conseguir isso?

Aqui está minha tentativa:

ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia');

O erro que recebo é: ERROR 1265 (01000): Data truncated for column 'country' at row 1.

A coluna do country é a coluna do tipo ENUM na declaração acima.

SHOW CREATE TABLE OUTPUT:

mysql> SHOW CREATE TABLE carmake;
+---------+---------------------------------------------------------------------+
| Table   | Create Table
+---------+---------------------------------------------------------------------+
| carmake | CREATE TABLE `carmake` (
`carmake_id` tinyint(4) NOT NULL AUTO_INCREMENT,
`name` tinytext,
`country` enum('Japan','USA','England','Australia','Germany','France','Italy','Spain','Czech Republic','China','South Korea','India') DEFAULT NULL,
PRIMARY KEY (`carmake_id`),
KEY `name` (`name`(3))
) ENGINE=InnoDB AUTO_INCREMENT=49 DEFAULT CHARSET=latin1 |
+---------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

SELECT DISTINCT country FROM carmake OUTPUT:

+----------------+
| country        |
+----------------+
| Italy          |
| Germany        |
| England        |
| USA            |
| France         |
| South Korea    |
| NULL           |
| Australia      |
| Spain          |
| Czech Republic |
+----------------+

A discussion que tive com Asafe pode não ser clara quando seguimos e voltamos um pouco.

Eu pensei que eu poderia esclarecer o resultado de nosso discurso para outros que poderiam enfrentar situações semelhantes no futuro para se beneficiar de:

ENUM colunas do tipo ENUM são animais muito difíceis de manipular. Eu queria adicionar dois países (Malásia e Suécia) ao conjunto existente de países no meu ENUM.

Parece que o MySQL 5.1 (que é o que eu estou executando) só pode atualizar o ENUM, redefinindo o conjunto existente, além do que eu quero:

Isso não funcionou:

ALTER TABLE carmake CHANGE country country ENUM('Sweden','Malaysia') DEFAULT NULL;

A razão era que a declaração do MySQL estava substituindo o ENUM existente por outro contendo apenas as entradas 'Malaysia' e 'Sweden' . O MySQL lançou um erro porque a tabela carmake já tinha valores como 'England' e 'USA' que não faziam parte da nova definição do ENUM .

Surpreendentemente, o seguinte não funcionou:

ALTER TABLE carmake CHANGE country country ENUM('Australia','England','USA'...'Sweden','Malaysia') DEFAULT NULL;

Acontece que até mesmo a ordem dos elementos do ENUM existente precisa ser preservada ao adicionar novos membros a ele. Assim, se o meu ENUM existente se assemelhar a ENUM('England','USA') , então o meu novo ENUM tem que ser definido como ENUM('England','USA','Sweden','Malaysia') e não ENUM('USA','England','Sweden','Malaysia') . Esse problema só se torna manifesto quando há registros na tabela existente que usam valores 'USA' ou 'England' .

LINHA DE FUNDO:

Use somente ENUM s quando você não espera que seu conjunto de membros seja alterado uma vez definido. Caso contrário, as tabelas de consulta são muito mais fáceis de atualizar e modificar.


FYI: Uma ferramenta de simulação útil - phpMyAdmin com Wampserver 3.0.6 - Preview SQL: Eu uso 'Preview SQL' para ver o código SQL que seria gerado antes de salvar a coluna com a alteração para ENUM. Visualizar SQL

Acima você vê que eu entrei 'Ford', 'Toyota' no ENUM mas estou recebendo a sintaxe ENUM (0) que está gerando erro de sintaxe Erro de consulta 1064 #

Eu então copio e colo e altero o SQL e o executo através do SQL com um resultado positivo.

SQL alterado

Essa é uma correção rápida que eu uso com frequência e também pode ser usada em valores ENUM existentes que precisam ser alterados. Pensei que isso poderia ser útil.


Na versão do servidor MYSQL: 5.0.27 eu tentei isso e funcionou bem para mim verificar em sua versão

ALTER TABLE carmake
     MODIFY `country` ENUM('Japan', 'USA', 'England', 'Australia', 'Germany', 'France', 'Italy', 'Spain', 'Czech Republic', 'China', 'South Korea', 'India', 'Sweden', 'Malaysia');

ALTER TABLE
    `table_name`
MODIFY COLUMN
    `column_name2` enum(
        'existing_value1',
        'existing_value2',
        'new_value1',
        'new_value2'
    )
NOT NULL AFTER `column_name1`;




alter-table