Mysql coluna DATE com valor padrão NOW()

30 respostas Resolvido
banco
T

Olá. Eu gostaria de fazer exatamente o que disse no título, queria que quando o usuário não inserisse a data, o sistema colocasse NOW() no campo, porém o MYSQL não está aceitando:

Alguém conhece uma maneira de fazer isso?

30 Respostas

F
Solucao aceita

Antes de Tudo:
Tenta NOW() Maiúsculo
Adapta a sua necessidade ai …

O que você precisa fazer eh definir um valor default ao criar a tabela:
Exemplo:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255) DEFAULT ‘Sandnes’
)

ou Triggers:
Exemplo:

CREATE TABLE MyTable (
MyTable_ID int UNSIGNED NOT NULL AUTO_INCREMENT ,
MyData varchar(10) NOT NULL ,
CreationDate datetime NULL ,
UpdateDate datetime NULL ,
PRIMARY KEY (MyTable_ID)
)
;

CREATE TRIGGER MyTable_INSERT BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
– Set the creation date
SET new.CreationDate = now();

-- Set the udpate date

Set new.UpdateDate = now();
END;

CREATE TRIGGER MyTable_UPDATE BEFORE UPDATE ON MyTable
FOR EACH ROW BEGIN
– Set the udpate date
Set new.UpdateDate = now();
END;

T

Dá na mesma.

“Frmichetti:

CREATE TRIGGER MyTable_INSERT BEFORE INSERT ON MyTableFOR EACH ROW BEGIN – Set the creation dateSET new.CreationDate = now();

– Set the udpate date

Set new.UpdateDate = now();END;

CREATE TRIGGER MyTable_UPDATE BEFORE UPDATE ON MyTableFOR EACH ROW BEGIN – Set the udpate dateSet new.UpdateDate = now();END;

Sua ideia funciona e é interessante, mas qual é o problema com DEFAULT NOW()? Não vejo nenhum problema de sintaxe aí.
Mas de qualquer forma, já implementei no meu projeto sua ideia, valeu.

L

NOW() é uma função, logo ela não pode ser usada como valor padrão, ao invés use o CURRENT_TIMESTAMP

T

Valeu pela ajuda.

L

A idéia da trigger é válida, mas pensando no futuro, use trigger somente se necessário, pois a medida que a tabela cresce, pode afetar o desempenho…

F

Bom beleza , contornou o problema.

Mas tentando entender o motivo…

Está utilizando MySQL WorkBench (pelo Print parece que sim…)?

Depois a título de Curiosidade: execute esses scripts:

DROP DATABASE IF EXISTS test;

CREATE DATABASE IF NOT EXISTS test;

use test;

DROP TABLE IF EXISTS Persons;

CREATE TABLE IF NOT EXISTS Persons
(

P_Id int KEY AUTO_INCREMENT NOT NULL,

LastName varchar(255) NOT NULL,

FirstName varchar(255),

Address varchar(255),

City varchar(255) DEFAULT 'Sandnes',

DateAndTime DATETIME Default NOW()

);

Até aqui deve executar normalmente.


Teste 1:

Depois:

SELECT * FROM test.Persons;

Tudo deve ser listado normalmente.

Recaptulando:
P_ID = auto Increment INT
DateAndTime = Default TImestamp frow NOW()

Dai eu vou com cuidado entre as celular e aponto o mouse e digito apenas nos campos que são necessários:
(Repare que os Campos P_ID e DateAndTime estão com um ‘Flagzinho Null’)

E agora ao fazer um Apply :

Sucesso.


Teste 2:

Agora eu Sem Tomar cuidado fui la e cliquei sem Querer na primeira Célula ID preenchi todas as outras e no Time And Date Deixei Vazio: Repare que o Tagzinho null Sumiu.

Olha o Script gerado:

Olha o Erro:

AI eu fui insistir:

Repare o Script:

Crash Again:

Moral da Historia.

Não é você ou a sua sintaxe que está errada.
Apesar da interface tornar mais fáceis as operações parece que ela não está realizando algumas coisas direito:
Penso que seja esse o motivo de não ter funcionado ai.
Realize esses testes … verifique se não é a ferramenta q está gerando confusão…

T

Okay, vou substituir o trigger pela outra solução.

L

Não me interprete mal, trigger tem sua utilidade, mas para essa situação creio não ser necessária… é apenas uma questão de “o mais adequado” para esse caso…

T

Eu estava utilizando o HeidSql naquele momento, porém o mesmo erro ocorre no Workbench:

ALTER TABLE eventos MODIFY COLUMN inicia DATE default NOW();

T

Bem, demorou um pouquinho porque eu acabei me esquecendo, mas olha só o que eu estou recebendo aqui agora:

T

E quando eu tento alterar o valor do campo manualmente para NOW(), eu recebo essa mensagem:

L

Troque sua coluna para DATETIME ou TIMESTAMP e veja se o erro persiste…

L

Esse código de erro 1442 tem haver com sua trigger, procure pesquisar sobre esses códigos, é a forma que a base te informa dos erros ocorridos…

Não faz sentido manter a trigger e o valor default no campo, você terá de escolher entre um ou outro…

T

Sim, mesmo mudando, o erro persiste.

T

O problema é que eu já removi os dois triggers a muito tempo. Pesquisar foi a primeira coisa que eu fiz, porém eu realmente não entendo o porquê de eu estar recebendo esse erro.

L

O mysql costuma apresentar alguns problemas de estrutura, pesquise sobre recover table ou manutenção de tabelas…

as vezes algumas regras ficam desajustadas no banco, ocasionando erros esquisitos…

T

Isso seria tipo um reset? Posso perder dados? A estrutura da minha tabela vai mudar?

L

Não necessariamente, são ferramentas que auxiliam identificar problemas na estrutura.

Quanto a perda de dados, faça backup por garantia, mas alguns comandos não afetam os dados, apenas a estrutura…

T

Vou pesquisar sobre isso, quando descobrir, te dou uma resposta. Mas isso resolveria o meu problema da foto que eu mandei, que não é possível inserir a data no campo, porém o valor padrão eu não resolvi ainda, pois nenhuma das alternativas funcionaram exceto o trigger. Não existe alguma outra variável que sirva para isso?

T

O erro da foto eu corrigi. Era um trigger antigo que eu tinha criado para um teste e nem prestei atenção.

T

Eu corrigi o erro da foto, mas ainda não consegui implementar o valor padrão.

L

Alguma mensagem de erro ao definir o CURRENT_TIMESTAMP?

Já tentou alterar a coluna via linha de comando?

ALTER TABLE tabela MODIFY coluna DATE NOT NULL DEFAULT CURRENT_TIMESTAMP
T

L

Configure no seu banco o sql mode ALLOW_INVALID_DATES

T

Eu configurei assim:

SET SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

Porém a mesma mensagem apareceu.

L

Bem estranho, várias pesquisas que fiz diziam coisas sobre a versão da base, qual é a sua?

Algumas diziam que a partir da versão 5.6 o mysql aceita função como valor default :scream:

T

5.7.14. Alguma outra sugestão? Qualquer coisa, eu ainda tenho a solução do trigger.

L

Sinto muito, meu arsenal acabou :joy:

T

Tudo bem. Vou implementar a solução do trigger. Talvez alguém passe por esse tópico e saiba resolver, senão, eu continuo com essa solução. A não ser que os problemas de performance sejam muito altos.

L

Olhando a doc da sua versão, está dizendo que para campos TIMESTAMP e DATETIME, o valor pode ser inicializado sim e justamente usando CURRENT_TIMESTAMP :joy:

https://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html

Há exemplos usando o DEFAULT 0, mas ele cita algo sobre as sql mode

Em outro post, o pessoal está indicando limpar o sql mode

Se for fazer, sugiro copiar o valor antigo e guardar em um notepad da vida…

Criado 4 de março de 2017
Ultima resposta 10 de mar. de 2017
Respostas 30
Participantes 3