NOW () öğesini datetime veri türü için Varsayılan Değer olarak mı ayarladınız?


197

Tablo kullanıcıları registerDate and lastVisitDatedatetime veri türü oluşur iki sütun var . Aşağıdakileri yapmak istiyorum.

  1. RegisterDate varsayılanları değerini MySQL NOW () olarak ayarlayın
  2. LastVisitDate varsayılan değerini, 0000-00-00 00:00:00varsayılan olarak kullandığı null yerine olarak ayarlayın .

Tablo zaten var olduğundan ve mevcut kayıtları olduğundan, Değiştir tablosunu kullanmak istiyorum. Aşağıdaki iki kod parçasını kullanmayı denedim, ama ikisi de çalışmıyor.

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

Bana Hata veriyor: ERROR 1067 (42000): Invalid default value for 'registerDate'

MySQL'de varsayılan datetime değerini NOW () olarak ayarlamam mümkün mü?


4
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP. data typeAlanınızı her iki
çabanızda

3
MySQL 5.6 DATEvarsayılan değerle çalıştığındanNOW()
AbcAeffchen

Bu mysql 5.6 belgelerine göre: dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html , varsayılan olarak CURRENT_TIMESTAMP () yöntemini kullanabilirsiniz.
blacktie24

CURRENT_TIMESTAMP + 1 GÜN nasıl uygulanır?
İlker Baltacı

Yanıtlar:


241

MySQL 5.6.5'ten itibaren, DATETIMEtürü dinamik bir varsayılan değere sahip olarak kullanabilirsiniz :

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

Veya her iki kuralı da birleştirin:

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

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

5.6.5'ten önce TIMESTAMP, kayıt her değiştirildiğinde otomatik olarak güncellenen veri türünü kullanmanız gerekir . Ancak maalesef, TIMESTAMPtablo başına yalnızca bir otomatik olarak güncellenen alan bulunabilir.

CREATE TABLE mytable (
  mydate TIMESTAMP
)

Bkz. Http://dev.mysql.com/doc/refman/5.1/en/create-table.html

MySQL'in zaman damgası değerini UPDATE(yalnızca tetiklenecek şekilde INSERT) güncellemesini önlemek istiyorsanız tanımı şu şekilde değiştirebilirsiniz:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

80
Gerçekten zaman damgası kullanmak istemiyorum.
İbrahim Azhar Armar

2
@Ibrahim: zaman damgası tek şansın. Tarih-saat alanı kullanıyorsanız, now () öğesini her zaman kullanarak kayıt eklemeniz gerekir.
Nicola Cossu

9
Manuel şunu açıkça ifade eder: "Örneğin, bir tarih sütununun varsayılan değerini NOW () veya CURRENT_DATE gibi bir işlevin değeri olarak ayarlayamayacağınız anlamına gelir".
Nicola Cossu

20
@Johan DATETIME, TIMESTAMPS's' 1970-01-01 00 ile karşılaştırıldığında '1000-01-01 00:00:00' ile '9999-12-31 23:59:59' arasında olabileceği aralığı yapmak için sıklıkla tercih edilir : 00:01 'UTC -' 2038-01-19 03:14:07 'UTC. Örneğin doğum tarihlerini veya gelecekte 30 yıldan daha uzun bir süre saklamak amacıyla.
user17753

5
@nickrulez timestampMySQL 5.6
Dan Esparza

70

Yeni ekler için datetime alanını NOW () olarak ayarlamak için geçici çözüm olarak bir tetikleyici kullanıyorum:

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

güncellemeler için de çalışmalı

Johan ve Leonardo'nun cevapları bir zaman damgası alanına dönüştürmeyi içerir. Her ne kadar bu soruda (RegisterDate ve LastVisitDate depolamak) sunulan kullanım durumu için uygun olsa da, evrensel bir çözüm değildir. Tarih -saat vs zaman damgası sorusuna bakınız.


4
Bu kabul edilen cevap olmalıdır, ancak özellikle bir datetime alanı için açık olduğunu belirtmek üzere düzenlemelisiniz. Orijinal poster, tarih-saat alanı için nasıl çözüleceğini bilmek ister ve use a timestampbu iki veri türü arasındaki farkı gerçekten öğrenirseniz, aptalca bir çözümdür.
phpguru

45

Çözümüm

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

Bu def çalışır, herkese SQLYog veya böyle bir araç kullanmasını öneririm, bu şeyleri kolay bir arayüzde yapmanıza izin verir.
Dayanıklı Tuğla

27
Bu hala TIMESTAMPsütun için bir çözümdür . Kimse istemiyordu TIMESTAMP...
Petr Peller

2
Evet, bu sorunun cevabı değil. TIMESTAMP, DATETIME için farklı bir alan türüdür.
John Hunt

@Leonardo nasıl sadece tarih gösterebilirim
151291

13

EUREKA !!!


MySQL'de varsayılan bir DATETIME değeri ayarlamaya çalışırken kalbi kaybeden herkes için , nasıl hissettiğini / hissettiğini tam olarak biliyorum. İşte burada:

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

0'ın etrafına tek tırnak / çift tırnak eklemediğimi dikkatlice gözlemleyin .


Önemli güncelleme :

Bu cevap uzun zaman önce gönderildi. O zamanlar MySQL (muhtemelen en son) kurulumum üzerinde çalıştı ve onu paylaşmak gibi hissettim. Bu çözümü şimdi kullanmaya karar vermeden önce lütfen aşağıdaki yorumları okuyun.


16
Beklentilere bağlıdır ... - Bu çözüm, varsayılan olarak sağlandığından, BOŞ DEĞİL alanına sahip olmanızı sağlar. - Bu çözüm alanı NOW () olarak ayarlamaz.
CodeReaper

10
Bu asıl soruya cevap vermiyor; cevap bunu açıkça belirtmelidir.
Matt Browne

2
GELENEKSEL SQL modunun NO_ZERO_DATE içerdiğini unutmayın, bu nedenle yukarıdakiler bu durumda çalışmaz.
Moz

Verilen cevaplara dayanarak, DATETIME değerini TIMESTAMP olarak feda etmeyecekseniz, tetikleyicileri kullanmanız gerekir.
Chris

1
Bu çözüm "OMG bu bir SIFIR tarih! Ne bir HERESY! 'Bu' bir java.lang.Date/System.DateTime! OMG! -Crashes-" dönüştürmek ile apis deli olacak.
Felype


4

Mysql 5.6.5 ve daha yeni sürümlerde, kesin tarihler kullanabilir ve varsayılan değerleri de ayarlayabilirsiniz. Bununla birlikte, hassas değeri hem datetime hem de NOW () işlev çağrısına iletmek için ince bir bit vardır.

Bu Örnek Çalışır:

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

Bu Örnek Çalışmıyor:

    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

Güncelleme sırasında zaman damgasını güncellemek için kullanılabilir.


1

En iyi yol "VARSAYILAN 0" kullanmaktır. Diğer yol:

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

Bu MySQL kullanarak benim için çalıştı:

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;

Sonunda, bu benim için çalıştı!


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

Bunun hala aktif olup olmadığından emin değilim ama işte gidiyor.

Varsayılanların Now () olarak ayarlanmasıyla ilgili olarak, DATETIME veri türü için bunun mümkün olduğunu görmüyorum. Bu veri türünü kullanmak istiyorsanız, eki gerçekleştirirken tarihi şu şekilde ayarlayın:

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

MySQL sürümüm 5.5


7
Basitleştirilmiş:INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753

-1

Bu benim için çalıştı - sadece tablo için GÜNCELLE için INSERT değiştirildi.

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.