आप MySQL डेटाटाइम कॉलम के लिए डिफ़ॉल्ट मान कैसे सेट करते हैं?
SQL सर्वर में है getdate()
। MySQL के लिए समकक्ष क्या है? अगर वह एक कारक है तो मैं MySQL 5.x का उपयोग कर रहा हूं।
आप MySQL डेटाटाइम कॉलम के लिए डिफ़ॉल्ट मान कैसे सेट करते हैं?
SQL सर्वर में है getdate()
। MySQL के लिए समकक्ष क्या है? अगर वह एक कारक है तो मैं MySQL 5.x का उपयोग कर रहा हूं।
जवाबों:
महत्वपूर्ण संस्करण: अब 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 ** का उपयोग कर रहा हूं
DATE
कॉलम के लिए डिफ़ॉल्ट मान संभव है ? ( datetime
कॉलम नहीं )।
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
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
MySQL ( संस्करण 5.6.5 से पहले ) फ़ंक्शन को डिफ़ॉल्ट DateTime मानों के लिए उपयोग करने की अनुमति नहीं देता है। TIMESTAMP अपने विषम व्यवहार के कारण उपयुक्त नहीं है और इनपुट डेटा के रूप में उपयोग करने के लिए अनुशंसित नहीं है। (देखें MySQL डेटा टाइप डिफॉल्ट्स ।)
कहा कि, आप इसे ट्रिगर बनाकर पूरा कर सकते हैं ।
मेरे पास एक तालिका है जिसमें DateCreated फ़ील्ड का प्रकार DateTime है। मैंने उस तालिका "इंसर्ट इन्सर्ट" और " SET NEW.DateCreated=NOW()
" पर एक ट्रिगर बनाया और यह बहुत अच्छा काम करता है।
मुझे उम्मीद है कि इससे किसी को मदद मिलेगी।
IF NEW.created_at IS NOT NULL
मेरे लिए ट्रिगर दृष्टिकोण ने सबसे अच्छा काम किया है, लेकिन मुझे दृष्टिकोण के साथ एक रोड़ा मिला। डालने पर वर्तमान समय के लिए दिनांक फ़ील्ड सेट करने के लिए मूल ट्रिगर पर विचार करें:
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 () की तरह कुछ साफ करने के लिए अभी भी यहूदी बस्ती है, लेकिन हम करीब हो रहे हैं!
NULL
। अब कोई चेतावनी नहीं।
dateAdded
सभी '0000-00-00 00:00:00' दिखाई देंगे। इसका उपयोग करने से यह चाल चली जाती है: `प्रत्येक पंक्ति के लिए यदि NEW.dateAdded = 0 नया सेट किया गया है। अब = (); END IF; `
मैं अपनी तालिका में दो परिवर्तनशील फ़ील्ड वाले इस परिवर्तन कथन का उपयोग करके इसे हल करने में सक्षम था।
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] _ [सम्मिलित करना] पसंद करूं
इस प्रकार के सामान को करने के लिए आप ट्रिगर्स का उपयोग कर सकते हैं।
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;
उन सभी लोगों के लिए, जिन्होंने MySQL में एक डिफ़ॉल्ट DATETIME मान सेट करने का प्रयास किया , मुझे पता है कि आप कैसा महसूस करते हैं / महसूस करते हैं। तो यहाँ है:
ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
ध्यान से देखें कि मैंने 0 के आसपास सिंगल कोट्स / डबल कोट्स नहीं जोड़े हैं
मैं इसे हल करने के बाद सचमुच कूद रहा हूं: डी
ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
MySQL 5.6 ने इस समस्या को ठीक कर दिया है ।
ALTER TABLE mytable CHANGE mydate datetime NOT NULL DEFAULT 'CURRENT_TIMESTAMP'
यदि आपने पहले ही टेबल बना लिया है तो आप उपयोग कर सकते हैं
वर्तमान दिनांक समय के लिए डिफ़ॉल्ट मान बदलने के लिए
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';
यह वास्तव में भयानक खबर है। इसके लिए एक लंबे समय से लंबित बग / सुविधा अनुरोध है । यह चर्चा टाइमस्टैम्प डेटा प्रकार की सीमाओं के बारे में भी बात करती है।
मैं गंभीरता से सोच रहा हूं कि इस बात को लागू करने में क्या समस्या है।
मैं 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') के "शून्य" मान में परिवर्तित हो जाते हैं।
आप एक डेटाइम कॉलम के मान को सेट करने के लिए अब () का उपयोग कर सकते हैं, लेकिन ध्यान रखें कि आप इसे डिफ़ॉल्ट मान के रूप में उपयोग नहीं कर सकते हैं।
NOW()
और बाद में उपयोग करें। संस्करण 5.6 के लिए, बस NOW()
डिफ़ॉल्ट मान के रूप में सेट करें ।
उन सभी लोगों के लिए जो एक समाधान के रूप में 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 वर्षों में आपके सॉफ़्टवेयर को तोड़ देगा।
मेरा मानना है कि डेटाबेस पक्ष पर एकमात्र समाधान अन्य उत्तरों में उल्लिखित जैसे ट्रिगर का उपयोग करना है।
मल्टी-लाइन ट्रिगर्स को परिभाषित करते समय एक सीमांकक को बदलना होगा क्योंकि ट्रिगर के अंत के रूप में माइकोलीन कंपाइलर द्वारा अर्धविराम लिया जाएगा और त्रुटि उत्पन्न करेगा। जैसे
DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
-- Set the udpate date
Set new.UpdateDate = now();
END//
DELIMITER ;
यहाँ यह MySQL 5.1 पर कैसे करें:
ALTER TABLE `table_name` CHANGE `column_name` `column_name`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
मुझे कोई सुराग नहीं है कि आपको कॉलम नाम दो बार क्यों दर्ज करना है।
यदि आप अब () के रूप में डिफ़ॉल्ट मान सेट करने का प्रयास कर रहे हैं, तो मुझे नहीं लगता कि MySQL का समर्थन करता है। MySQL में, आप किसी भी प्रकार के कॉलम के लिए डिफ़ॉल्ट मान के रूप में फ़ंक्शन या अभिव्यक्ति का उपयोग नहीं कर सकते, सिवाय TIMESTAMP डेटा टाइप कॉलम के, जिसके लिए आप CURRENT_TIMESTAMP को डिफ़ॉल्ट के रूप में निर्दिष्ट कर सकते हैं।
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
निम्नलिखित कोड का उपयोग करें
DELIMITER $$
CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
BEGIN
SET new.datefield = NOW();
END $$
DELIMITER ;
उदाहरण के लिए लें, अगर मेरे पास create_at के साथ 'साइट' नाम की एक तालिका और एक अद्यतन_ट कॉलम है जो दोनों DATETIME थे और अब के डिफ़ॉल्ट मान की आवश्यकता है, तो मैं इसे प्राप्त करने के लिए निम्नलिखित sql निष्पादित कर सकता हूं।
वैकल्पिक सारणी 'साइट' को बदलें 'create_at`' create_at` TIMESTAMP नहीं पूरी तरह से समाप्त CURRENT_TIMESTAMP; वैकल्पिक सारणी 'साइट' को बदलें 'create_at`` create_at` DATETIME NULL DEFAULT NULL; वैकल्पिक सारणी 'साइट' को बदलें 'अपडेट किया गया' अपडेट किया गया है। वैकल्पिक सारणी 'साइट' को बदलें 'अपडेट' किया गया।
कथनों का क्रम महत्वपूर्ण है क्योंकि एक तालिका में CIMENT TIMESTAMP के डिफ़ॉल्ट मानों के साथ TIMESTAMP प्रकार के दो कॉलम नहीं हो सकते
यह मेरा ट्रिगर उदाहरण है:
/************ 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();
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;
आप डिफ़ॉल्ट टाइमस्टैम्प को हल कर सकते हैं। पहले विचार करें कि आप किस वर्ण सेट का उपयोग कर रहे हैं यदि u utf8 लिया जाए तो यह वर्ण सभी भाषाओं का समर्थन करता है और यदि u laten1 लिया जाता है तो यह वर्ण केवल अंग्रेजी के लिए समर्थन प्रदान करता है। अगला सेटप यदि आप किसी प्रोजेक्ट के तहत काम कर रहे हैं तो आपको क्लाइंट टाइम ज़ोन जानना चाहिए और आप क्लाइंट ज़ोन हैं। यह कदम अनिवार्य है।