drop - mysql add column default value



Por que uma coluna de texto não pode ter um valor padrão no MySQL? (6)

Se você tentar criar uma coluna TEXT em uma tabela e atribuir a ela um valor padrão no MySQL, receberá um erro (pelo menos no Windows). Não consigo ver nenhum motivo pelo qual uma coluna de texto não deva ter um valor padrão. Nenhuma explicação é dada pela documentação do MySQL. Parece ilógico para mim (e um pouco frustrante, como eu quero um valor padrão!). Alguém sabe por que isso não é permitido?


Answer #1

"Suporte para DEFAULT em colunas TEXT / BLOB" é uma solicitação de recurso no Bugtracker do MySQL (Bug # 21532) .

Eu vejo que não sou o único que gostaria de colocar um valor padrão em uma coluna de texto. Eu acho que esse recurso deve ser suportado em uma versão posterior do MySQL.

Isso não pode ser corrigido na versão 5.0 do MySQL, porque aparentemente isso causaria incompatibilidade e dataloss se alguém tentasse transferir um banco de dados entre os bancos de dados (atuais) que não suportam esse recurso e quaisquer bancos de dados que suportassem esse recurso.


Answer #2

Como a questão principal:

Alguém sabe por que isso não é permitido?

ainda não foi respondida, eu fiz uma busca rápida e encontrei uma adição relativamente nova de um desenvolvedor MySQL no MySQL Bugs :

[17 de mar de 2017 15:11] Ståle Deraas

Postado por desenvolvedor:

Esta é realmente uma solicitação de recurso válida e, à primeira vista, pode parecer trivial adicionar. Mas os valores TEXT / BLOBS não são armazenados diretamente no buffer de registro usado para ler / atualizar tabelas. Portanto, é um pouco mais complexo atribuir valores padrão a eles.

Esta não é uma resposta definitiva, mas pelo menos um ponto de partida para a pergunta do porquê .

Nesse meio tempo, vou apenas codificar em torno dele e tornar a coluna anulável ou atribuir explicitamente um valor (padrão '' ) para cada insert do código do aplicativo ...


Answer #3

O Windows MySQL v5 gera um erro, mas o Linux e outras versões apenas geram um aviso. Isso precisa ser corrigido. WTF?

Veja também uma tentativa de consertar isso como bug # 19498 no Bugtracker do MySQL:

Bryce Nesbitt em 4 de abril de 2008 16:36:
No MS Windows, a regra "no DEFAULT" é um erro, enquanto que em outras plataformas é frequentemente um aviso. Embora não seja um bug, é possível ficar preso a isso se você escrever código em uma plataforma leniente e, posteriormente, executá-lo em uma plataforma estrita:

Pessoalmente, vejo isso como um bug. A pesquisa por "coluna BLOB / TEXT não pode ter um valor padrão" retorna cerca de 2.940 resultados no Google. A maioria deles são relatórios de incompatibilidades ao tentar instalar scripts de banco de dados que funcionavam em um sistema, mas não em outros.

Eu estou correndo para o mesmo problema agora em um webapp que estou modificando para um dos meus clientes, originalmente implantado no Linux MySQL v5.0.83-log. Estou executando o Windows MySQL v5.1.41. Mesmo tentando usar a versão mais recente do phpMyAdmin para extrair o banco de dados, ele não reporta um padrão para a coluna de texto em questão. No entanto, quando tento executar uma inserção no Windows (que funciona bem na implantação do Linux), recebo um erro de ausência de padrão na coluna ABC. Eu tento recriar a tabela localmente com o padrão óbvio (com base em uma seleção de valores exclusivos para essa coluna) e acabo recebendo a tão boa coluna BLOB / TEXT não pode ter um valor padrão .

Novamente, não manter a compatibilidade básica entre as plataformas é inaceitável e é um bug.

Como desabilitar o modo estrito no MySQL 5 (Windows):

  • Edite /my.ini e procure por linha

    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  • Substitua-o por

    sql_mode='MYSQL40'
  • Reinicie o serviço MySQL (supondo que seja mysql5)

    net stop mysql5
    net start mysql5

Se você tem acesso root / admin você pode ser capaz de executar

mysql_query("SET @@global.sql_mode='MYSQL40'");

Answer #4

O que exatamente você está fazendo? Um teste rápido aqui mostrou que uma coluna de texto pode ter um valor padrão:

    mysql> create table test (a char(32) not null default 'this works', b char(32) not null);
    Query OK, 0 rows affected (0.03 sec)
    mysql> insert into test (b) values('hello');
    Query OK, 1 row affected (0.01 sec)
    mysql> select * from test;

+------------+-------+
| a          | b     |
+------------+-------+
| this works | hello |
+------------+-------+
1 row in set (0.00 sec)

Answer #5

Sem qualquer conhecimento profundo do mecanismo mySQL, eu diria que isso soa como uma estratégia de economia de memória. Presumo que a razão esteja por trás deste parágrafo dos docs :

Cada valor BLOB ou TEXT é representado internamente por um objeto alocado separadamente. Isso está em contraste com todos os outros tipos de dados, para os quais o armazenamento é alocado uma vez por coluna quando a tabela é aberta.

Parece que o preenchimento prévio desses tipos de coluna levaria ao uso da memória e às penalidades de desempenho.


Answer #6

Você pode obter o mesmo efeito que um valor padrão usando um gatilho

create table my_text

(
   abc text
);

delimiter //
create trigger mytext_trigger before insert on my_text
for each row
begin
   if (NEW.abc is null ) then
      set NEW.abc = 'default text';
   end if;
end
//
delimiter ;




default-value