O manual de referência do MySQL não fornece um exemplo claro de como fazer isso.
Eu tenho uma coluna do tipo ENUM de nomes de países aos quais preciso adicionar mais países. Qual é a sintaxe correta do MySQL para conseguir isso?
Aqui está a 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 country
coluna é a coluna do tipo ENUM na instrução acima.
MOSTRAR CRIAR SAÍDA DE TABELA :
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 |
+----------------+
mysql
enums
alter-table
Zaid
fonte
fonte
inplace
desde 10.3.7: mariadb.com/kb/en/library/...Seu código funciona para mim. Aqui está o meu caso de teste:
Que erro você está vendo?
FWIW, isso também funcionaria:
Na verdade, eu recomendaria uma tabela de países em vez de uma coluna enum. Você pode ter centenas de países, o que resultaria em um enum bastante grande e constrangedor.
EDIT: Agora que posso ver sua mensagem de erro:
Eu suspeito que você tenha alguns valores na coluna do seu país que não aparecem na sua
ENUM
. Qual é a saída do seguinte comando?OUTRA EDIÇÃO: Qual é a saída do seguinte comando?
É
STRICT_TRANS_TABLES
ouSTRICT_ALL_TABLES
? Isso poderia levar a um erro, ao invés do aviso usual que o MySQL lhe daria nessa situação.AINDA OUTRA EDIÇÃO: Ok, agora vejo que você definitivamente tem valores na tabela que não estão no novo
ENUM
. A novaENUM
definição permite apenas'Sweden'
e'Malaysia'
. A mesa tem'USA'
,'India'
e várias outras.ÚLTIMA EDIÇÃO (TALVEZ): Acho que você está tentando fazer isso:
fonte
carmake
tabela. Isso poderia ter algo a ver com isso?A discussão que tive com Asaph pode não ser clara a seguir, já que andávamos de um lado para o outro.
Eu pensei que poderia esclarecer o resultado do nosso discurso para que outras pessoas que possam enfrentar situações semelhantes no futuro se beneficiem:
ENUM
colunas de tipo são bestas muito difíceis de manipular. Eu queria adicionar dois países (Malásia e Suécia) ao conjunto de países existente 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:
O motivo foi que a instrução MySQL estava substituindo o ENUM existente por outro contendo as entradas
'Malaysia'
e'Sweden'
somente. O MySQL gerou um erro porque acarmake
tabela já tinha valores como'England'
e'USA'
que não faziam parte daENUM
definição da nova .Surpreendentemente, o seguinte também não funcionou:
Acontece que mesmo a ordem dos elementos do existente
ENUM
precisa ser preservada ao adicionar novos membros a ele. Portanto, se o meu existenteENUM
parece algo parecidoENUM('England','USA')
, então o meu novoENUM
deve ser definido comoENUM('England','USA','Sweden','Malaysia')
e nãoENUM('USA','England','Sweden','Malaysia')
. Esse problema só se manifesta quando há registros na tabela existente que usam'USA'
ou'England'
valores.LINHA INFERIOR:
Use
ENUM
s somente quando você não espera que seu conjunto de membros mude uma vez definido. Caso contrário, as tabelas de pesquisa são muito mais fáceis de atualizar e modificar.fonte
Na versão do servidor MYSQL: 5.0.27, tentei isso e funcionou bem para mim, verifique sua versão
fonte
FYI: Uma ferramenta de simulação útil - phpMyAdmin with 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 ENUM. Visualizar SQL
Acima, você vê que inseri 'Ford', 'Toyota' no ENUM, mas estou recebendo a sintaxe ENUM (0), que está gerando erro de sintaxe Erro de consulta 1064 #
Em seguida, copio e colo e altero o SQL e o executo através do SQL com um resultado positivo.
SQL alterado
Esta é uma correção rápida que uso com freqüência e também pode ser usada em valores ENUM existentes que precisam ser alterados. Achei que isso poderia ser útil.
fonte
Aqui está outra maneira ...
Ele adiciona "outros" à definição enum da coluna "rtipo" da tabela "firmas".
fonte
É possível se você acreditar. Ele Ele. tente este código.
Antes de adicionar novo valor
Depois de adicionar novo valor
fonte