Definir NOW () como valor padrão para o tipo de dados datetime?


197

Eu tenho duas colunas nos usuários da tabela, registerDate and lastVisitDateque consistem no tipo de dados datetime. Eu gostaria de fazer o seguinte.

  1. Defina o valor padrão do registerDate como MySQL NOW ()
  2. Defina o valor padrão lastVisitDate como 0000-00-00 00:00:00Em vez de nulo, que ele usa por padrão.

Como a tabela já existe e possui registros, eu gostaria de usar a tabela Modify. Eu tentei usar os dois trechos de código abaixo, mas nenhum deles funciona.

ALTER TABLE users MODIFY registerDate datetime DEFAULT NOW()
ALTER TABLE users MODIFY registerDate datetime DEFAULT CURRENT_TIMESTAMP;

Isso me dá erro: ERROR 1067 (42000): Invalid default value for 'registerDate'

É possível definir o valor padrão de data e hora como NOW () no MySQL?


4
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP. Você não definiu o data typede campo, tanto de seus esforços
Shakti Singh

3
Desde o MySQL 5.6 DATEdeve funcionar com o valor padrãoNOW()
AbcAeffchen

De acordo com esta documentação do mysql 5.6: dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html , você pode usar CURRENT_TIMESTAMP () como padrão.
blacktie24

Como eu poderia implementar CURRENT_TIMESTAMP + 1 DIA
Ilker Baltaci

Respostas:


241

No MySQL 5.6.5, você pode usar o DATETIMEtipo com um valor padrão dinâmico:

CREATE TABLE foo (
    creation_time      DATETIME DEFAULT   CURRENT_TIMESTAMP,
    modification_time  DATETIME ON UPDATE CURRENT_TIMESTAMP
)

Ou mesmo combine as duas regras:

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Referência:
http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html
http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-available .html

Antes da 5.6.5, você precisa usar o TIMESTAMPtipo de dados, que é atualizado automaticamente sempre que o registro é modificado. Infelizmente, no entanto, apenas um TIMESTAMPcampo de atualização automática pode existir por tabela.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

Consulte: http://dev.mysql.com/doc/refman/5.1/en/create-table.html

Se você deseja impedir que o MySQL atualize o valor do registro de data e hora UPDATE(para que seja ativado apenas INSERT), você pode alterar a definição para:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

80
eu realmente não quero usar timestamp.
Ibrahim Azhar Armar

2
@ Ibrahim: timestamp é sua única chance. Se você usar um campo de data e hora, precisará inserir um registro usando now () toda vez.
Nicola Cossu

9
O manual fala claramente: "Isso significa, por exemplo, que você não pode definir o padrão para uma coluna de data como o valor de uma função como NOW () ou CURRENT_DATE".
Nicola Cossu

19
Geralmente, DATETIMEé preferível @Johan fazer o intervalo que pode conter: '1000-01-01 00:00:00' a '9999-12-31 23:59:59' em comparação com TIMESTAMPS's' 1970-01-01 00: 00:01 'UTC para' 2038-01-19 03:14:07 'UTC. Para fins de armazenamento de datas de nascimento, ou algo mais de 30 anos no futuro, por exemplo.
user17753

5
@nickrulez Você não está mais restrito a timestampesse comportamento a partir do MySQL 5.6
Dan Esparza

70

Eu uso um gatilho como solução alternativa para definir um campo de data e hora como NOW () para novas inserções:

CREATE TRIGGER `triggername` BEFORE INSERT ON  `tablename` 
FOR EACH ROW 
SET NEW.datetimefield = NOW()

deve funcionar para atualizações também

As respostas de Johan e Leonardo envolvem a conversão em um campo de carimbo de data / hora. Embora isso provavelmente esteja correto para o caso de uso apresentado na pergunta (armazenando RegisterDate e LastVisitDate), não é uma solução universal. Consulte a pergunta data / hora versus carimbo de data / hora .


4
Essa deve ser a resposta aceita, mas especificamente você deve editá-la para tornar óbvio que é para um campo de data e hora. O pôster original quer saber como resolvê-lo para um campo de data e hora e use a timestampé uma solução tola se você realmente aprender a diferença entre esses dois tipos de dados.
Phpuru #

45

Minha solução

ALTER TABLE `table_name` MODIFY COLUMN `column_name` TIMESTAMP NOT
NULL DEFAULT CURRENT_TIMESTAMP;

Essa definição funciona, eu recomendo a todos que usem o SQLYog ou uma ferramenta como essa, ele permite que você faça essas coisas em uma interface fácil.
11898 Imutável Brick

27
Ainda é a solução para a TIMESTAMPcoluna. Ninguém estava pedindo TIMESTAMP...
Petr Peller

2
Sim, esta não é a resposta para a pergunta. TIMESTAMP é um tipo diferente de campo para DATETIME.
John Hunt

@Leonardo como posso exibir apenas a data
151291

13

EUREKA !!!


Para todos aqueles que perderam o coração tentando definir um valor DATETIME padrão no MySQL , eu sei exatamente como você se sente / sentiu. Então aqui está:

`ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

Observe com cuidado que eu não adicionei aspas simples / aspas duplas ao redor do 0 .


Atualização importante :

Esta resposta foi postada há muito tempo. Naquela época, funcionava na minha (provavelmente mais recente) instalação do MySQL e tive vontade de compartilhá-lo. Por favor, leia os comentários abaixo antes de decidir usar esta solução agora.


16
Depende das expectativas ... - Esta solução permite que você tenha o campo NOT NULL, pois é fornecido um padrão. - Esta solução não definirá o campo para NOW ().
CodeReaper

10
Isso não responde à pergunta original; a resposta deve indicar isso claramente.
Matt Browne

2
Esteja ciente de que o modo SQL TRADICIONAL inclui NO_ZERO_DATE, portanto, o acima não funcionará nesse caso.
Móż

Com base nas respostas fornecidas, parece que se você não sacrificar DATETIME para ser TIMESTAMP, deverá usar gatilhos.
31413 Chris

1
Esta solução terá algumas APIs loucas com "OMG, é uma data ZERO! Que HERESIA! Não podemos converter 'isso' em java.lang.Date/System.DateTime! OMG! -Crashes-".
Felype 5/05


4

Nas versões mysql 5.6.5 e mais recentes, você pode usar datas precisas e definir valores padrão também. Há um pouco sutil, porém, que é passar o valor de precisão para a chamada de função datetime e NOW ().

Este exemplo funciona:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW(6);

Este exemplo não funciona:

    ALTER TABLE my_table MODIFY created datetime(6) NOT NULL DEFAULT NOW();

1
`ALTER TABLE  `table_name` CHANGE `column_name` 
    timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
    ON UPDATE CURRENT_TIMESTAMP

Pode ser usado para atualizar o carimbo de data / hora na atualização.


1

A melhor maneira é usar "PADRÃO 0". Outro jeito:

    /************ ROLE ************/
    drop table if exists `role`;
    create table `role` (
        `id_role` bigint(20) unsigned not null auto_increment,
        `date_created` datetime,
        `date_deleted` datetime,
        `name` varchar(35) not null,
        `description` text,
        primary key (`id_role`)
    ) comment='';

    drop trigger if exists `role_date_created`;
    create trigger `role_date_created` before insert
        on `role`
        for each row 
        set new.`date_created` = now();

0

Isso funcionou para mim, usando o MySQL:

ALTER TABLE `table_name` MODIFY `column_name` datetime NOT NULL DEFAULT NOW();

0
ALTER TABLE table_name
  CHANGE COLUMN date_column_name date_column_name DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

Finalmente, isso funcionou para mim!


0
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dateCreated` datetime DEFAULT CURRENT_TIMESTAMP,
  `dateUpdated` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `mobile_UNIQUE` (`mobile`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-1

Não tenho certeza se isso ainda está ativo, mas aqui vai.

Em relação à configuração dos padrões para Now (), não vejo isso possível para o tipo de dados DATETIME. Se você deseja usar esse tipo de dados, defina a data em que você executa a inserção da seguinte maneira:

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

Minha versão do mySQL é 5.5


7
Pode ser simplificado como:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753 12/12

-1

Isso funcionou para mim - apenas alterei INSERT para UPDATE para minha mesa.

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.