आप MySQL डेटाटाइम कॉलम के लिए डिफ़ॉल्ट मान कैसे सेट करते हैं?


898

आप MySQL डेटाटाइम कॉलम के लिए डिफ़ॉल्ट मान कैसे सेट करते हैं?

SQL सर्वर में है getdate()। MySQL के लिए समकक्ष क्या है? अगर वह एक कारक है तो मैं MySQL 5.x का उपयोग कर रहा हूं।


4
मैं अपनी mysql तालिका (क्वेरी में नहीं) में CURRENT_TIMESTAMP का उपयोग करता हूं, शायद यह सहायक भी हो सकता है।
रूबेन

15
यह फीचर अब MySQL 5.6.5 में जोड़ा गया है। आशा है कि यह किसी की मदद करता है। ऑप्टिमाइज़-
this.blogspot.co.uk/2012/04/…

@GhostInTheSecureShell को स्थापित करने के लिए काफी मिशन, कम से कम डेबियन पर, लेकिन निश्चित रूप से एक भयानक विशेषता। मुझे लगता है कि अंततः इन सभी "दो CURRENT_TIMESTAMP" प्रश्नों को हटा दिया जाएगा!
मार्क डिमिलो

यह अब () फ़ंक्शन है या फिर आप कॉलम स्तर पर डिफ़ॉल्ट सेटिंग्स के साथ कर सकते हैं।
अंशुल शर्मा

जवाबों:


862

महत्वपूर्ण संस्करण: अब MySQL 5.6.5 के बाद DATETIME फ़ील्ड के साथ इसे प्राप्त करना संभव है , नीचे दिए गए अन्य पोस्ट पर एक नज़र डालें ...

पिछले संस्करण DATETIME के ​​साथ ऐसा नहीं कर सकते ...

लेकिन आप इसे TIMESTAMP के साथ कर सकते हैं:

mysql> create table test (str varchar(32), ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)

mysql> desc test;
+-------+-------------+------+-----+-------------------+-------+
| Field | Type        | Null | Key | Default           | Extra |
+-------+-------------+------+-----+-------------------+-------+
| str   | varchar(32) | YES  |     | NULL              |       | 
| ts    | timestamp   | NO   |     | CURRENT_TIMESTAMP |       | 
+-------+-------------+------+-----+-------------------+-------+
2 rows in set (0.00 sec)

mysql> insert into test (str) values ("demo");
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+------+---------------------+
| str  | ts                  |
+------+---------------------+
| demo | 2008-10-03 22:59:52 | 
+------+---------------------+
1 row in set (0.00 sec)

mysql>

** CAVEAT: यदि आप डिफ़ॉल्ट रूप में CURRENT_TIMESTAMP के साथ एक कॉलम परिभाषित करते हैं, तो आपको इस कॉलम के लिए हमेशा एक मान निर्दिष्ट करना होगा या मान स्वतः अपडेट होने पर "अब ()" पर रीसेट हो जाएगा। इसका मतलब यह है कि यदि आप मूल्य नहीं बदलना चाहते हैं, तो आपके अपडेट स्टेटमेंट में "[आपका कॉलम नाम] = [[आपका कॉलम नाम]" (या कुछ अन्य मूल्य) या मान "अब ()" हो जाएगा। अजीब, लेकिन सच है। आशा है कि ये आपकी मदद करेगा। मैं 5.5.56- MariaDB ** का उपयोग कर रहा हूं


400
यह ध्यान रखना महत्वपूर्ण है कि डेटाइम की सीमा 1000-9999 है, लेकिन टाइमस्टैम्प के लिए सीमा केवल 1970-2038 है । यह एक समस्या हो सकती है यदि आपके सिस्टम को जन्मतिथियों को संग्रहीत करना है, या आपको 30-वर्षीय बंधक के लिए भुगतान योजना की तरह कुछ संभालना है। dev.mysql.com/doc/refman/5.0/en/datetime.html
किप

13
टाइमस्टैम्प के साथ सावधानीपूर्वक रहें क्योंकि यह जादुई रूप से अपडेट होता है ... अगले उत्तर में देखें stackoverflow.com/a/1483959/233906
सेबर

6
यह है संभव संस्करण 5.6.5 से नीचे दिए गए गुस्ताव की उत्तर देखें (मुझे पता है आपका जवाब जब MySQL अभी भी 5.0 था पोस्ट किया गया था!)
e2-E4

4
@ किप, हाय, क्या किसी DATEकॉलम के लिए डिफ़ॉल्ट मान संभव है ? ( datetimeकॉलम नहीं )।
साजिब आचार्य

TATE

598

5.6.5 संस्करण में, डेटाइम कॉलम पर एक डिफ़ॉल्ट मान सेट करना संभव है, और यहां तक ​​कि एक स्तंभ बना सकते हैं जो पंक्ति के अपडेट होने पर अपडेट होगा। प्रकार परिभाषा:

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

संदर्भ: http://optimize-this.blogspot.com/2012/04/datetime-default-now-finally-be.html


3
'Menu_creation_time' के लिए अमान्य डिफ़ॉल्ट मान
फर्नांडो

2
@FernandoTrindade आपको MySQL संस्करण 5.6.5 या बाद के संस्करण की आवश्यकता है। आप इसे यहां काम करते हुए देख सकते हैं: sqlfiddle.com/#
गुस्ताव बर्ट्राम

1
@GustavBertram, मैं 5.6.22 संस्करण का उपयोग कर रहा हूं, लेकिन फिर भी मुझे निम्नानुसार त्रुटि मिली: क्रिएट टेबल टीबीएल (इन्सर्ट डिटाइम नॉट नाउल डिफाल्ट CURRENT_TIMESTAMP, अपडेटडाइम टाइमस्टैम्प अप पर अद्यतन CURRENT_TIMESTAMP (6)); त्रुटि कोड:
1294.

@ManishSapkal आप एक टाइमस्टैम्प का उपयोग कर रहे हैं, एक DATETIME का नहीं। इसके अलावा, इसे पूरा मत करो।
गुस्ताव बर्ट्राम

1
मुझे लगता है कि "ON UPDATE" सिंटैक्स गलत है। Dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html के अनुसार यह होना चाहिएdt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Dan

148

MySQL ( संस्करण 5.6.5 से पहले ) फ़ंक्शन को डिफ़ॉल्ट DateTime मानों के लिए उपयोग करने की अनुमति नहीं देता है। TIMESTAMP अपने विषम व्यवहार के कारण उपयुक्त नहीं है और इनपुट डेटा के रूप में उपयोग करने के लिए अनुशंसित नहीं है। (देखें MySQL डेटा टाइप डिफॉल्ट्स ।)

कहा कि, आप इसे ट्रिगर बनाकर पूरा कर सकते हैं ।

मेरे पास एक तालिका है जिसमें DateCreated फ़ील्ड का प्रकार DateTime है। मैंने उस तालिका "इंसर्ट इन्सर्ट" और " SET NEW.DateCreated=NOW()" पर एक ट्रिगर बनाया और यह बहुत अच्छा काम करता है।

मुझे उम्मीद है कि इससे किसी को मदद मिलेगी।


21
प्रत्येक ट्रिगर ट्रिगर_foo_SetCreatedA से आगे आने पर प्रत्येक पंक्ति के लिए सेट करें NEW.created_at = UTC_TIMESTAMP ();
kgriffs

5
आप शायद भविष्य की पवित्रता (रखरखाव) के लिए ट्रिगर की तुलना में टाइमस्टैम्प का उपयोग कर रहे हैं। यह एक ट्रिगर के लिए बहुत तुच्छ उपयोग मामला है, हालांकि यह एक समाधान है।
getWeberForStackExchange

8
आप शायद केवल डिफ़ॉल्ट मान सेट करना चाहेंगेIF NEW.created_at IS NOT NULL
पेट्र पेलर

132

मेरे लिए ट्रिगर दृष्टिकोण ने सबसे अच्छा काम किया है, लेकिन मुझे दृष्टिकोण के साथ एक रोड़ा मिला। डालने पर वर्तमान समय के लिए दिनांक फ़ील्ड सेट करने के लिए मूल ट्रिगर पर विचार करें:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = NOW();

यह आमतौर पर बहुत अच्छा है, लेकिन कहते हैं कि आप INSERT विवरण के माध्यम से मैन्युअल रूप से फ़ील्ड सेट करना चाहते हैं, जैसे:

INSERT INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');

क्या होता है कि ट्रिगर तुरंत क्षेत्र के लिए आपके प्रदान किए गए मूल्य को ओवरराइट कर देता है, और इसलिए गैर-वर्तमान समय सेट करने का एकमात्र तरीका अनुवर्ती कथन है - yuck! मान प्रदान किए जाने पर इस व्यवहार को ओवरराइड करने के लिए, IFNULL ऑपरेटर के साथ थोड़ा संशोधित ट्रिगर आज़माएं:

CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
    FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());

यह दोनों दुनिया को सबसे अच्छा देता है: आप अपनी तारीख के कॉलम के लिए एक मूल्य प्रदान कर सकते हैं और यह ले जाएगा, और अन्यथा यह वर्तमान समय के लिए डिफ़ॉल्ट होगा। यह तालिका परिभाषा में DEFAULT GETDATE () की तरह कुछ साफ करने के लिए अभी भी यहूदी बस्ती है, लेकिन हम करीब हो रहे हैं!


5
+1 डालने पर स्पष्ट उपयोगकर्ता मानों की ओवरराइटिंग के साथ कैवेट को स्वीकार करने के लिए।
किप

2
मुझे व्यक्तिगत रूप से लगता है कि यह जाने का सबसे अच्छा तरीका है। TIMESTAMP का वास्तव में अजीब व्यवहार है और मैं कभी भी ऐसा कोड नहीं लिखूंगा जिसमें 2038 साल की सीमा हो।
एरिक

कोई बात नहीं, मैंने इसका हल निकाल लिया। अनुमति देने के लिए फ़ील्ड सेट करना भूल गया NULL। अब कोई चेतावनी नहीं।
काजी

ट्रिगर दुष्ट हैं! केवल उनका उपयोग तब करें जब कुछ करने का कोई अन्य तरीका न हो। एक ट्रिगर का उपयोग करने की तुलना में 5.6.x आईडी पर अपग्रेड करने के लिए बेहतर होगा।
ksymeon

4
MySQL 5.5 में IFNULL DATETIME पर काम नहीं करता है; उपरोक्त ट्रिगर का उपयोग करके dateAddedसभी '0000-00-00 00:00:00' दिखाई देंगे। इसका उपयोग करने से यह चाल चली जाती है: `प्रत्येक पंक्ति के लिए यदि NEW.dateAdded = 0 नया सेट किया गया है। अब = (); END IF; `
केने

28

मैं अपनी तालिका में दो परिवर्तनशील फ़ील्ड वाले इस परिवर्तन कथन का उपयोग करके इसे हल करने में सक्षम था।

ALTER TABLE `test_table`
  CHANGE COLUMN `created_dt` `created_dt` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
  CHANGE COLUMN `updated_dt` `updated_dt` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

यह काम करता है क्योंकि आप काम करने के लिए अब () फ़ंक्शन की अपेक्षा करेंगे। नल को सम्मिलित करना या बनाए गए_dt और updated_dt फ़ील्ड को अनदेखा करना दोनों क्षेत्रों में एक सही टाइमस्टैम्प मान में परिणाम करता है। पंक्ति में कोई भी अद्यतन update_dt बदलता है। यदि आप MySQL क्वेरी ब्राउज़र के माध्यम से रिकॉर्ड सम्मिलित करते हैं, तो आपको एक और कदम की आवश्यकता है, एक नए टाइमस्टैम्प के साथ create_dt को संभालने के लिए एक ट्रिगर।

CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
    FOR EACH ROW SET NEW.created_dt = NOW();

ट्रिगर वह हो सकता है जो आप चाहते हैं कि मैं केवल नामकरण सम्मेलन [ट्रिगर] _ [my_table_name] _ [सम्मिलित करना] पसंद करूं


मेरा कहने का मतलब था, यदि आप MySQL क्वेरी ब्राउजर के माध्यम से ग्रिड के माध्यम से मैन्युअल रूप से एक सम्मिलित किए बिना रिकॉर्ड सम्मिलित करते हैं (तो) कथन को ट्रिगर की आवश्यकता है। यदि आप हमेशा एक सम्मिलित विवरण का उपयोग करते हैं तो ट्रिगर पूरी तरह से अनावश्यक है।

ओह! मेरा मतलब था कि ट्रिगर (नाम) आप जो भी चाहते हैं वह हो सकता है क्योंकि ट्रिगर नाम कार्यक्षमता को प्रभावित नहीं करता है। ज्यादातर लोगों को पता होगा कि, लेकिन MySQL के लिए कुछ लोग शायद नहीं जानते ...

Yikes, लाइन टूटने की कमी के बारे में खेद है। प्रत्येक पंक्ति के अंत को चिह्नित करने के लिए अर्ध-कॉलनों का उपयोग करें।

24

इस प्रकार के सामान को करने के लिए आप ट्रिगर्स का उपयोग कर सकते हैं।

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;

18

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

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

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

मैं इसे हल करने के बाद सचमुच कूद रहा हूं: डी


8
यह सम्मिलित नहीं करता है वर्तमान समय नहीं है। यह '0000-00-00 00:00:00' डालेगा।
पिट डिगर

8
मैंने यह नहीं कहा कि यह वर्तमान समय निर्धारित करता है। कई पीपीएल एक डिफ़ॉल्ट शून्य मान सेट करने की कोशिश कर रहे थे, लेकिन यह सिर्फ काम नहीं करता है। हमें उद्धरणों को समाप्त करने की आवश्यकता है। चूंकि इस खोज ने बहुत समय और निराशा पैदा की, इसलिए मैंने इसे समुदाय के साथ साझा करने के बारे में सोचा। आपके जैसे लोग अन्य लोगों के साथ उपयोगी जानकारी साझा करने में रुचि खोने वाले उपयोगकर्ताओं के लिए जिम्मेदार हैं। मैं गंभीरता से -1 पाने के लिए कोई कारण नहीं देखता! जो कुछ।
अगस्त्य

3
उसी को DATETIME NOT NULL के साथ हासिल किया जा सकता है।
ब्रेंडन बर्ड

उदाहरण sql कमांड के अंदर एक और `वर्ण है, जिसे मैं संपादित नहीं कर सकता, क्योंकि यह केवल एक-वर्ण संपादित है।
quapka

आपके कोड ने मेरे लिए काम नहीं किया, यहाँ क्या काम किया हैALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
स्मिथ


14

यदि आपने पहले ही टेबल बना लिया है तो आप उपयोग कर सकते हैं

वर्तमान दिनांक समय के लिए डिफ़ॉल्ट मान बदलने के लिए

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;

डिफ़ॉल्ट मूल्य को '2015-05-11 13:01:01' में बदलने के लिए

ALTER TABLE <TABLE_NAME> 
CHANGE COLUMN <COLUMN_NAME> <COLUMN_NAME> DATETIME NOT NULL DEFAULT '2015-05-11 13:01:01';

13

यह वास्तव में भयानक खबर है। इसके लिए एक लंबे समय से लंबित बग / सुविधा अनुरोध है । यह चर्चा टाइमस्टैम्प डेटा प्रकार की सीमाओं के बारे में भी बात करती है।

मैं गंभीरता से सोच रहा हूं कि इस बात को लागू करने में क्या समस्या है।



9

मैं MySql सर्वर 5.7.11 और इस वाक्य को चला रहा हूं:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

है काम कर रहे। लेकिन निम्नलिखित:

ALTER TABLE table_name CHANGE date_column datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

बस काम करता है

के तौर पर विचार के , यह mysql डॉक्स में उल्लिखित है :

DATE प्रकार का उपयोग दिनांक भाग के साथ मानों के लिए किया जाता है, लेकिन कोई समय भाग नहीं। MySQL 'YYYY-MM-DD' प्रारूप में DATE मानों को पुनः प्राप्त और प्रदर्शित करता है। समर्थित रेंज '1000-01-01' से '9999-12-31' तक है।

अगर वे भी कहते हैं:

अमान्य DATE, DATETIME या TIMESTAMP मान उचित प्रकार ('0000-00-00' या '0000-00-00 00:00:00') के "शून्य" मान में परिवर्तित हो जाते हैं।


8

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


4
सच। मैंने अभी उपयोग करने की कोशिश की और एक त्रुटि मिली "त्रुटि कोड: 1067। अमान्य डिफ़ॉल्ट मान।" तो जवाब क्या है? ;-)
ब्रायन बोटराइट ऑक्ट

यह MySQL संस्करणों 5.5 और 5.6 से समझौता करने का सबसे अच्छा समाधान है। संस्करण ५.५ के लिए, पूर्वनिर्धारित के मूल्य को पूर्वनिर्धारित करें NOW()और बाद में उपयोग करें। संस्करण 5.6 के लिए, बस NOW()डिफ़ॉल्ट मान के रूप में सेट करें ।
हाबिल कैलेजो

8

उन सभी लोगों के लिए जो एक समाधान के रूप में TIMESTAMP कॉलम का उपयोग करते हैं, मैं मैनुअल से निम्नलिखित सीमा को पूरा करना चाहता हूं:

http://dev.mysql.com/doc/refman/5.0/en/datetime.html

"TIMESTAMP डेटा प्रकार की एक सीमा है ' 1970-01-01 00:00:01 ' UTC से ' 2038-01-19 03:22:07 ' UTC ' UTC है। इसमें MySQL संस्करण और SQL पर निर्भर करते हुए अलग-अलग गुण हैं। सर्वर चल रहा है। इन गुणों का वर्णन इस खंड में बाद में किया गया है। "

तो यह स्पष्ट रूप से लगभग 28 वर्षों में आपके सॉफ़्टवेयर को तोड़ देगा।

मेरा मानना ​​है कि डेटाबेस पक्ष पर एकमात्र समाधान अन्य उत्तरों में उल्लिखित जैसे ट्रिगर का उपयोग करना है।


2
क्या होगा अगर MySQL अब से 20 साल बाद अपडेट किया गया था और उस सीमा को हटा दिया गया था? मुझे यकीन नहीं है कि यह संभव है लेकिन सिर्फ एक विचार है।
नेसदान

7

मल्टी-लाइन ट्रिगर्स को परिभाषित करते समय एक सीमांकक को बदलना होगा क्योंकि ट्रिगर के अंत के रूप में माइकोलीन कंपाइलर द्वारा अर्धविराम लिया जाएगा और त्रुटि उत्पन्न करेगा। जैसे

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

5

यहाँ यह MySQL 5.1 पर कैसे करें:

ALTER TABLE `table_name` CHANGE `column_name` `column_name` 
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

मुझे कोई सुराग नहीं है कि आपको कॉलम नाम दो बार क्यों दर्ज करना है।


5
क्षेत्र का नाम बदलने के लिए भी बदलें। पहला कॉलम नाम 'पुराना' है, दूसरा कॉलम नाम 'नया' है। यदि आप फ़ील्ड का नाम नहीं बदल रहे हैं तो यह बेमानी लगता है। यदि यह बहुत ही सौंदर्य विहीन है, तो कोशिश करें।
जॉन गोर्डन

5

जब आप DATETIMEडिफ़ॉल्ट परिभाषा के साथ ऐसा नहीं कर सकते हैं , तो आप इस तरह से अपने सम्मिलित विवरण में एक चयन कथन शामिल कर सकते हैं:

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

तालिका के चारों ओर उद्धरण की कमी पर ध्यान दें।

MySQL 5.5 के लिए


3

यदि आप अब () के रूप में डिफ़ॉल्ट मान सेट करने का प्रयास कर रहे हैं, तो मुझे नहीं लगता कि MySQL का समर्थन करता है। MySQL में, आप किसी भी प्रकार के कॉलम के लिए डिफ़ॉल्ट मान के रूप में फ़ंक्शन या अभिव्यक्ति का उपयोग नहीं कर सकते, सिवाय TIMESTAMP डेटा टाइप कॉलम के, जिसके लिए आप CURRENT_TIMESTAMP को डिफ़ॉल्ट के रूप में निर्दिष्ट कर सकते हैं।


3

मुझे लगता है कि यह mysql में सरल है क्योंकि mysql इनबिल्ट फंक्शन अब () जो वर्तमान समय (उस इंसर्ट का समय) देता है।

तो आपकी क्वेरी समान दिखनी चाहिए

CREATE TABLE defaultforTime(
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME default now()
);

धन्यवाद।


2
CREATE TABLE `testtable` (
    `id` INT(10) NULL DEFAULT NULL,
    `colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)

'परीक्षण योग्य' बनाने के लिए उपरोक्त क्वेरी में, मैंने '1999-12-12 12:12:12' का उपयोग DATETIME कॉलम के लिए डिफ़ॉल्ट मान के रूप में किया colname


1

निम्नलिखित कोड का उपयोग करें

DELIMITER $$

    CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
    BEGIN
      SET new.datefield = NOW();
    END $$

    DELIMITER ;

0

यदि आप अब () के रूप में डिफ़ॉल्ट मान सेट करने का प्रयास कर रहे हैं, तो MySQL का समर्थन करता है कि आपको DATETIME के ​​बजाय उस कॉलम TIMESTAMP के प्रकार को बदलना होगा। TIMESTAMP की वर्तमान तिथि और समय डिफ़ॉल्ट के रूप में है। मुझे लगता है कि यह आपकी समस्या का समाधान करेगा।


0

उदाहरण के लिए लें, अगर मेरे पास create_at के साथ 'साइट' नाम की एक तालिका और एक अद्यतन_ट कॉलम है जो दोनों DATETIME थे और अब के डिफ़ॉल्ट मान की आवश्यकता है, तो मैं इसे प्राप्त करने के लिए निम्नलिखित sql निष्पादित कर सकता हूं।

वैकल्पिक सारणी 'साइट' को बदलें 'create_at`' create_at` TIMESTAMP नहीं पूरी तरह से समाप्त CURRENT_TIMESTAMP;

वैकल्पिक सारणी 'साइट' को बदलें 'create_at`` create_at` DATETIME NULL DEFAULT NULL;

वैकल्पिक सारणी 'साइट' को बदलें 'अपडेट किया गया' अपडेट किया गया है।

वैकल्पिक सारणी 'साइट' को बदलें 'अपडेट' किया गया।

कथनों का क्रम महत्वपूर्ण है क्योंकि एक तालिका में CIMENT TIMESTAMP के डिफ़ॉल्ट मानों के साथ TIMESTAMP प्रकार के दो कॉलम नहीं हो सकते


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 8.x के साथ काम करना ठीक है

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;

-3

आप डिफ़ॉल्ट टाइमस्टैम्प को हल कर सकते हैं। पहले विचार करें कि आप किस वर्ण सेट का उपयोग कर रहे हैं यदि u utf8 लिया जाए तो यह वर्ण सभी भाषाओं का समर्थन करता है और यदि u laten1 लिया जाता है तो यह वर्ण केवल अंग्रेजी के लिए समर्थन प्रदान करता है। अगला सेटप यदि आप किसी प्रोजेक्ट के तहत काम कर रहे हैं तो आपको क्लाइंट टाइम ज़ोन जानना चाहिए और आप क्लाइंट ज़ोन हैं। यह कदम अनिवार्य है।


2
दिनांक समय स्तंभों में डिफ़ॉल्ट मान नहीं हो सकते। यह 'फीचर' प्रलेखित है। सभी डेवलपर्स के पास अपने वर्ण एन्कोडिंग को बदलने के लिए पहुँच नहीं है। और सर्वर को क्लाइंट टाइमज़ोन पर सेट करना आमतौर पर एक संभावना नहीं है, खासकर जब क्लाइंट सभी एक ही समय क्षेत्र के मूल निवासी नहीं होते हैं।
rlb.usa
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.