Impostare NOW () come valore predefinito per il tipo di dati datetime?


197

Ho due colonne negli utenti della tabella, cioè registerDate and lastVisitDateche consistono nel tipo di dati datetime. Vorrei fare quanto segue.

  1. Impostare il valore predefinito registerDate su MySQL NOW ()
  2. Impostare il valore predefinito lastVisitDate su 0000-00-00 00:00:00Invece di null che utilizza per impostazione predefinita.

Poiché la tabella esiste già e contiene record esistenti, vorrei utilizzare Modifica tabella. Ho provato a usare i due pezzi di codice qui sotto, ma nessuno dei due funziona.

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

Mi dà errore: ERROR 1067 (42000): Invalid default value for 'registerDate'

È possibile impostare il valore datetime predefinito su NOW () in MySQL?


4
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP. Non hai definito il data typecampo di ambedue i tuoi sforzi
Shakti Singh,

3
Poiché MySQL 5.6 DATEdovrebbe funzionare con il valore predefinitoNOW()
AbcAeffchen

Secondo questa documentazione di mysql 5.6: dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html , è possibile utilizzare CURRENT_TIMESTAMP () come predefinito.
blacktie24,

come implementerei CURRENT_TIMESTAMP + 1 DAY
Ilker Baltaci

Risposte:


241

A partire da MySQL 5.6.5, è possibile utilizzare il DATETIMEtipo con un valore predefinito dinamico:

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

O anche combinare entrambe le regole:

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Riferimento:
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

Prima della 5.6.5, è necessario utilizzare il TIMESTAMPtipo di dati, che si aggiorna automaticamente ogni volta che il record viene modificato. Sfortunatamente, tuttavia, TIMESTAMPesiste un solo campo con aggiornamento automatico per tabella.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

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

Se vuoi impedire a MySQL di aggiornare il valore del timestamp UPDATE(in modo che si attivi solo INSERT) puoi modificare la definizione in:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

80
davvero non voglio usare il timestamp.
Ibrahim Azhar Armar,

2
@Ibrahim: il timestamp è la tua unica possibilità. Se usi un campo data / ora devi inserire il record usando now () ogni volta.
Nicola Cossu,

9
Il manuale parla chiaramente: "Ciò significa, ad esempio, che non è possibile impostare il valore predefinito per una colonna della data come valore di una funzione come NOW () o CURRENT_DATE".
Nicola Cossu,

19
@Johan DATETIMEè spesso preferito fare l'intervallo che può contenere: da '1000-01-01 00:00:00' a '9999-12-31 23:59:59' rispetto a TIMESTAMPS's' 1970-01-01 00: Da 00:01 "UTC a" 2038-01-19 03:14:07 "UTC. Ai fini della memorizzazione delle date di nascita, o qualcosa di più di 30 anni in futuro, ad esempio.
user17753,

5
@nickrulez Non sei più limitato a timestampquesto comportamento a partire da MySQL 5.6
Dan Esparza,

70

Uso un trigger come soluzione alternativa per impostare un campo datetime su NOW () per i nuovi inserti:

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

dovrebbe funzionare anche per gli aggiornamenti

Le risposte di Johan & Leonardo implicano la conversione in un campo data / ora. Anche se questo probabilmente va bene per il caso d'uso presentato nella domanda (memorizzazione di RegisterDate e LastVisitDate), non è una soluzione universale. Vedi domanda datetime vs timestamp .


4
Questa dovrebbe essere la risposta accettata, ma in particolare dovresti modificarla per renderlo ovvio che è per un campo datetime. Il poster originale vuole sapere come risolverlo per un campo datetime ed use a timestampè una soluzione sciocca se si impara davvero la differenza tra questi due tipi di dati.
phpguru,

45

La mia soluzione

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

Questo def funziona, consiglio a tutti di usare SQLYog o uno strumento del genere, ti permette di fare queste cose su un'interfaccia semplice.
Immutable Brick,

27
Questa è ancora la soluzione per la TIMESTAMPcolonna. Nessuno lo stava chiedendo TIMESTAMP...
Petr Peller,

2
Sì, questa non è la risposta alla domanda. TIMESTAMP è un tipo di campo diverso da DATETIME.
John Hunt,

@ Leonardo come posso visualizzare solo la data
151291

13

EUREKA !!!


Per tutti coloro che hanno perso la testa cercando di impostare un valore DATETIME predefinito in MySQL , so esattamente come ti senti / senti. Quindi eccolo qui:

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

Osservare attentamente che non ho aggiunto virgolette singole / doppie tra 0 .


Aggiornamento importante :

Questa risposta è stata pubblicata molto tempo fa. Allora, ha funzionato sulla mia (probabilmente la più recente) installazione di MySQL e mi è venuta voglia di condividerla. Si prega di leggere i commenti qui sotto prima di decidere di utilizzare questa soluzione ora.


16
Dipende dalle aspettative ... - Questa soluzione ti consente di avere il campo NOT NULL, poiché viene fornito un valore predefinito. - Questa soluzione non imposterà il campo su NOW ().
CodeReaper

10
Questo non risponde alla domanda originale; la risposta dovrebbe affermarlo chiaramente.
Matt Browne,

2
Tieni presente che la modalità SQL TRADIZIONALE include NO_ZERO_DATE, quindi in questo caso non funzionerà.
Móż,

Sulla base delle risposte fornite, sembra che se non sacrifichi DATETIME per essere TIMESTAMP, devi usare i trigger.
Chris,

1
Questa soluzione farà impazzire alcune API con "OMG è una data ZERO! Che ERESIA! Non possiamo convertire 'questo' in un java.lang.Date/System.DateTime! OMG! -Crash-".
Felype,


4

Nelle versioni mysql 5.6.5 e successive, è possibile utilizzare orari di dati precisi e impostare anche valori predefiniti. C'è un bit sottile, che è quello di passare il valore di precisione sia alla chiamata della funzione datetime che NOW ().

Questo esempio funziona:

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

Questo esempio non funziona:

    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

Può essere utilizzato per aggiornare il timestamp al momento dell'aggiornamento.


1

Il modo migliore è utilizzare "DEFAULT 0". Altro modo:

    /************ 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

Questo ha funzionato per me, usando 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, questo ha funzionato per me!


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

Non sono sicuro se questo è ancora attivo ma qui va.

Per quanto riguarda l'impostazione dei valori predefiniti su Now (), non vedo che ciò sia possibile per il tipo di dati DATETIME. Se si desidera utilizzare quel tipo di dati, impostare la data quando si esegue l'inserimento in questo modo:

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

La mia versione di mySQL è la 5.5


7
Può essere semplificato come:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753

-1

Questo ha funzionato per me - ho appena cambiato INSERT in UPDATE per il mio tavolo.

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.