अब सेट करें () डेटाटाइम डेटाटाइप के लिए डिफ़ॉल्ट मान के रूप में?


197

मेरे पास तालिका उपयोगकर्ताओं में दो कॉलम हैं registerDate and lastVisitDateजिनमें डेटाटाइम डेटा प्रकार शामिल हैं। मैं निम्नलिखित करना चाहूंगा।

  1. अब रजिस्टर MySQL के लिए रजिस्टर डिफ़ॉल्ट मान सेट करें ()
  2. डिफ़ॉल्ट के 0000-00-00 00:00:00बजाय अंतिम डिफ़ॉल्ट मान सेट करें जो इसे उपयोग करता है।

क्योंकि तालिका पहले से मौजूद है और मौजूदा रिकॉर्ड हैं, मैं संशोधित तालिका का उपयोग करना चाहूंगा। मैंने नीचे दिए गए कोड के दो टुकड़े का उपयोग करने की कोशिश की है, लेकिन न तो काम करता है।

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

यह मुझे त्रुटि देता है: ERROR 1067 (42000): Invalid default value for 'registerDate'

क्या मेरे लिए MySQL में डिफ़ॉल्ट डेटाइम मान अभी () पर सेट करना संभव है?


4
ALTER TABLE users MODIFY dateTime timestamp default CURRENT_TIMESTAMP। आपने data typeअपने दोनों प्रयासों में क्षेत्र को परिभाषित नहीं किया
शक्ति सिंह

3
चूंकि MySQL 5.6 DATEडिफ़ॉल्ट मान के साथ काम करना चाहिएNOW()
AbcAeffchen

इस mysql 5.6 प्रलेखन के अनुसार: dev.mysql.com/doc/refman/5.6/en/data-type-defaults.html , आप डिफ़ॉल्ट के रूप में CURRENT_TIMESTAMP () का उपयोग कर सकते हैं।
blacktie24

मैं CURRENT_TIMESTAMP + 1 DAY को कैसे लागू
करूंगा

जवाबों:


241

MySQL 5.6.5 के रूप में, आप DATETIMEएक गतिशील डिफ़ॉल्ट मान के साथ प्रकार का उपयोग कर सकते हैं :

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

या यहां तक ​​कि दोनों नियमों को मिलाएं:

modification_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

संदर्भ:
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 से पहले, आपको TIMESTAMPडेटा प्रकार का उपयोग करने की आवश्यकता है , जो रिकॉर्ड को संशोधित करने पर स्वचालित रूप से अपडेट करता है। दुर्भाग्य से, हालांकि, TIMESTAMPप्रति तालिका केवल एक ऑटो-अद्यतन फ़ील्ड मौजूद हो सकता है।

CREATE TABLE mytable (
  mydate TIMESTAMP
)

देखें: http://dev.mysql.com/doc/refman/5.1/en/create-table.html

यदि आप MySQL को टाइमस्टैम्प मान को अपडेट करने से रोकना चाहते हैं UPDATE(ताकि यह केवल चालू हो INSERT) तो आप परिभाषा बदल सकते हैं:

CREATE TABLE mytable (
  mydate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)

80
मैं वास्तव में टाइमस्टैम्प का उपयोग नहीं करना चाहता।
इब्राहिम अजहर अरमर

2
@ इब्राहिम: टाइमस्टैम्प आपका एकमात्र मौका है। यदि आप एक डेटाटाइम फ़ील्ड का उपयोग करते हैं, तो आपको अब () का उपयोग करके रिकॉर्ड सम्मिलित करना होगा।
निकोला कोसु

9
मैनुअल स्पष्ट रूप से बोलता है: "इसका मतलब है, उदाहरण के लिए, कि आप किसी फ़ंक्शन (जैसे या CURRENT_DATE) के मान को डेट कॉलम के लिए निर्धारित नहीं कर सकते हैं"।
निकोला कोसु

19
@ जोहान DATETIMEको प्रायः वह रेंज करने के लिए पसंद किया जाता है जो वह पकड़ सकती है: '1000-01-01 00:00:00' से '9999-12-31 23:59:59' की तुलना में '1970-01-01 TIMESTAMPS00: 00:01 'UTC से' 2038-01-19 03:14:07 'UTC। उदाहरण के लिए भविष्य में जन्म की तारीख, या 30 से अधिक वर्षों के भंडारण के प्रयोजनों के लिए।
user17753

5
@nickrulez अब आप timestampMySQL 5.6 के रूप में इस व्यवहार के लिए प्रतिबंधित नहीं हैं
Dan Esparza

70

मैं नए आवेषण के लिए अब () को डेटाइम फ़ील्ड सेट करने के लिए वर्कअराउंड के रूप में ट्रिगर का उपयोग करता हूं:

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

इसे अपडेट के लिए भी काम करना चाहिए

जोहान और लियोनार्डो के जवाब एक टाइमस्टैम्प क्षेत्र में परिवर्तित करना शामिल है। हालांकि यह प्रश्न में प्रस्तुत उपयोग के मामले के लिए संभवतः ठीक है (रजिस्टरडाइट और लास्टविसडेट को संग्रहीत करते हुए), यह एक सार्वभौमिक समाधान नहीं है। डेटाइम बनाम टाइमस्टैम्प प्रश्न देखें ।


4
यह स्वीकृत उत्तर होना चाहिए, लेकिन विशेष रूप से आपको इसे संपादित करने के लिए यह स्पष्ट करना चाहिए कि यह डेटाइम फ़ील्ड के लिए है। मूल पोस्टर यह जानना चाहता है कि एक डेटाइम फ़ील्ड के लिए इसे कैसे हल किया जाए, और use a timestampयह एक मूर्खतापूर्ण समाधान है यदि आप वास्तव में इन दो डेटा प्रकारों के बीच अंतर सीखते हैं।
phpguru

45

मेरा समाधान

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

यह डिफ कार्य करता है, मैं हर किसी को SQLYog या उस जैसे एक उपकरण का उपयोग करने की सलाह देता हूं, यह आपको एक आसान इंटरफ़ेस पर इस सामान को करने देता है।
अचल ईंट

27
यह TIMESTAMPस्तंभ के लिए अभी भी समाधान है । कोई नहीं पूछ रहा था TIMESTAMP...
पेट्र पेलर

2
हां, यह सवाल का जवाब नहीं है। TIMESTAMP DATETIME के ​​लिए एक अलग प्रकार का क्षेत्र है।
जॉन हंट


13

यूरेका !!!


उन सभी लोगों के लिए, जिन्होंने MySQL में एक डिफ़ॉल्ट DATETIME मान सेट करने का प्रयास किया , मुझे पता है कि आप कैसा महसूस करते हैं / महसूस करते हैं। तो यहाँ यह है:

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

ध्यान से देखें कि मैंने 0 के आसपास सिंगल कोट्स / डबल कोट्स नहीं जोड़े हैं


महत्वपूर्ण अपडेट :

यह उत्तर बहुत पहले पोस्ट किया गया था। इसके बाद, इसने MySQL के मेरे (शायद नवीनतम) इंस्टालेशन पर काम किया और मुझे ऐसा लगा कि इसे शेयर करना है। इस समाधान का उपयोग करने का निर्णय लेने से पहले कृपया नीचे दी गई टिप्पणियाँ पढ़ें।


16
यह उम्मीदों पर निर्भर करता है ... - यह समाधान आपको फ़ील्ड को पूरा करने की अनुमति नहीं देता है, क्योंकि डिफ़ॉल्ट रूप से प्रदान किया जाता है। - यह समाधान फ़ील्ड को अब () पर सेट नहीं करेगा।
कोडरेड

10
यह मूल प्रश्न का उत्तर नहीं देता है; उत्तर स्पष्ट रूप से कहा जाना चाहिए।
मैट ब्राउन ने

2
ध्यान रखें कि TRADITIONAL SQL मोड में NO_ZERO_DATE शामिल है, इसलिए उस स्थिति में ऊपर काम नहीं करेगा।
मोż

दिए गए उत्तरों के आधार पर, लगता है कि यदि आप DATETIME को TIMESTAMP होने के लिए बलिदान नहीं करेंगे, तो आपको ट्रिगर्स का उपयोग करना होगा।
क्रिस

1
इस समाधान के कुछ एपीस के साथ "ओएमजी एज़ जीरो डेट! व्हाट ए हेरेसी! हम इसे 'को' java.lang.Date/System.DateTime! OMG! -Crashes-" में परिवर्तित नहीं कर सकते।
Felype

4

mysql 5.6 डॉक्स का कहना है कि CURRENT_TIMESTAMP को TIMESTAMP और DATETIME दोनों प्रकार के डेटा के लिए डिफ़ॉल्ट रूप में उपयोग किया जा सकता है:

http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html


वास्तव में 5.6.5 से क्योंकि मेरे पास 5.6.22 है और अगर यह 5.6 है .. तो यह बहुत खराब है।
डेल्फीन

4

संस्करणों mysql 5.6.5 और नए पर, आप सटीक डेटासेट का उपयोग कर सकते हैं और डिफ़ॉल्ट मान भी सेट कर सकते हैं। हालाँकि, एक सूक्ष्म बिट है, जिसे डेटाइम और नाउ () फ़ंक्शन कॉल के लिए सटीक मान में पास करना है।

यह उदाहरण कार्य करता है:

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

यह उदाहरण काम नहीं करता है:

    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

अद्यतन पर टाइमस्टैम्प को अद्यतन करने के लिए इस्तेमाल किया जा सकता है।


1

सबसे अच्छा तरीका "DEFAULT 0" का उपयोग कर रहा है। अन्य रास्ता:

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

MySQL का उपयोग करते हुए इसने मेरे लिए काम किया:

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


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

यकीन नहीं होता कि यह अभी भी सक्रिय है लेकिन यहाँ जाता है।

अब () को डिफॉल्ट सेट करने के बारे में, मैं यह नहीं देखता कि डेटा टाइम डेटा प्रकार के लिए संभव हो सकता है। यदि आप उस डेटा प्रकार का उपयोग करना चाहते हैं, तो इस तरह डालने पर दिनांक सेट करें:

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

MySQL का मेरा संस्करण 5.5 है


7
: के रूप में सरल किया जा सकताINSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', NOW())
user17753

-1

इसने मेरे लिए काम किया - बस अपनी तालिका के लिए अद्यतन INSERT बदल दिया।

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.