DEFAULT क्लॉज में CURRENT_TIMESTAMP के साथ केवल एक TIMESTAMP कॉलम क्यों हो सकता है?


180

DEFAULT या ONDDATE क्लॉज में CURRENT_TIMESTAMP के साथ केवल एक TIMESTAMP कॉलम क्यों हो सकता है?

CREATE TABLE `foo` (
  `ProductID` INT(10) UNSIGNED NOT NULL,
  `AddedDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `UpdatedDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=INNODB;

परिणाम है कि त्रुटि:

त्रुटि कोड: 1293

गलत तालिका परिभाषा; DEFAULT में CURRENT_TIMESTAMP के साथ केवल एक TIMESTAMP स्तंभ हो सकता है या अद्यतन खंड में हो सकता है


6
यह वास्तव में त्रुटि संदेश क्या दिखते हैं की तुलना में बहुत खराब है। आप के साथ एक स्तंभ को परिभाषित नहीं कर सकते CURRENT_TIMESTAMPमें DEFAULTया ON UPDATEवहाँ के साथ एक स्तंभ है एक बार खंड TIMESTAMPडेटा प्रकार, कोई फर्क नहीं पड़ता अगर यह एक अतिरिक्त खंड मिल गया है!
निकोलस बुदुरोई

9
तो यह काम: CREATE TABLE foo (created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_on TIMESTAMP)लेकिन यह नहीं:CREATE TABLE foo (updated_on TIMESTAMP, created_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP)
निकोलस बुदुरोई

@ निकोलस ब्यूडुरोय नहीं अगर पहला timestampस्तंभ अशक्त है null। यदि पहला timestampकॉलम not nullडिफ़ॉल्ट रूप से है DEFAULT CURRENT_TIMESTAMPऔर ON UPDATE CURRENT_TIMESTAMPजोड़ा जाएगा। stackoverflow.com/a/13544181/2859238
user104309

@NicolasBuduroi यह भी नहीं कि पहले timestampकॉलम में स्पष्ट डिफ़ॉल्ट मान सेट है या नहीं default '0000-00-00 00:00:00'। स्तंभ नल या स्पष्ट रूप से डिफ़ॉल्ट मान सेट है, तो है DEFAULT CURRENT_TIMESTAMPऔर ON UPDATE CURRENT_TIMESTAMPनहीं जोड़ दिया जाएगा
user104309

वास्तव में क्यों के बारे में एक जवाब देखना पसंद करेंगे? नहीं कैसे इसके आसपास पाने के लिए या अब यह कैसे तय किया गया है। इसे कभी इस तरह से क्यों लागू किया गया? यह कुल ब्रेन्डेड तरीके की तरह लगता है और मुझे ऐसा कोई डिज़ाइन / कार्यान्वयन नहीं मिल सकता है जो इस प्रतिबंध का एक कारण हो सकता है। मैं सीखना चाहता हूं कि लोग कितने विनम्र हैं, इसलिए कृपया मुझे सिखाएं।
लोथार

जवाबों:


173

यह सीमा, जो केवल ऐतिहासिक, कोड विरासत कारणों के कारण थी, को MySQL के हाल के संस्करणों में हटा दिया गया है:

MySQL में परिवर्तन 5.6.5 (2012-04-10, माइलस्टोन 8)

पहले, प्रति टेबल पर अधिकांश TIMESTAMP कॉलम वर्तमान दिनांक और समय के अनुसार स्वचालित रूप से प्रारंभ या अद्यतन किया जा सकता था। यह प्रतिबंध हटा लिया गया है। किसी भी TIMESTAMP कॉलम की परिभाषा में DEFAULT CURRENT_TIMESTAMP और ON UPDATE CURRENT_TIMESTAMP क्लॉस का कोई संयोजन हो सकता है। इसके अलावा, अब इन खंडों को DATETIME स्तंभ परिभाषाओं के साथ उपयोग किया जा सकता है। अधिक जानकारी के लिए, TIMESTAMP और DATETIME के ​​लिए स्वचालित प्रारंभ और अद्यतन देखें।

http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html


नीचे @mooli उत्तर भी देखें। वास्तव में पहले टाइमस्टैम्प कॉलम में "डिफ़ॉल्ट चालू_timestamp ऑन अपडेट current_timestamp" स्वचालित रूप से सेट होता है (इसलिए इसे अद्यतन किया जाना चाहिए)। आपको सिर्फ इन्सर्ट टाइम पर मैन्युअल रूप से create_at सेट करना होगा।
जिस्मो राणास

अगर mysql डंप 5.7 संस्करण का है और सेटअप को 5.4
otc

1
@otc, आप डंप संपादित सकता है, या के साथ 5.4 फिर से शुरू
Jasen

40

मैं भी बहुत समय पहले सोचता था। मैंने अपने इतिहास में थोड़ी खोज की और मुझे लगता है कि यह पोस्ट: http://lists.mysql.com/internals/34919 MySQL की अर्ध-आधिकारिक स्थिति का प्रतिनिधित्व करती है (ओरेकल के हस्तक्षेप से पहले;))

संक्षेप में:

यह सीमा केवल उस तरीके से उपजी है जिसमें यह सुविधा वर्तमान में सर्वर में लागू की गई है और इसके अस्तित्व के लिए कोई अन्य कारण नहीं हैं।

तो उनका स्पष्टीकरण "क्योंकि यह इस तरह से लागू किया गया है"। बहुत वैज्ञानिक नहीं लगता है। मुझे लगता है कि यह सब कुछ पुराने कोड से आता है। यह ऊपर दिए गए धागे में सुझाया गया है: "कैरी-ओवर तब से जब केवल पहली टाइमस्टैम्प फ़ील्ड ऑटो-सेट / अपडेट थी"।

चीयर्स!


वाह, यह वास्तव में बदबू आ रही है। आशा है कि हम जल्द ही एक सुधार देखेंगे।
BoltClock

46
एक और महान MySQL सीमा हमारे लिए आनंद लेने के लिए!
निकोलस बुदुरोई

1
@ आसान समाधान / काम के आसपास स्कारलेट नीचे से एक है।
tihe

38

हम इस समस्या से बचने के लिए टाइमस्टैम्प के लिए एक डिफ़ॉल्ट मान दे सकते हैं।

यह पोस्ट विस्तृत विवरण देता है: http://gusiev.com/2009/04/update-and-create-timestamps-with-mysql/

create table test_table( 
id integer not null auto_increment primary key, 
stamp_created timestamp default '0000-00-00 00:00:00', 
stamp_updated timestamp default now() on update now() 
);

ध्यान दें कि "डालने" के दौरान दोनों स्तंभों में नल दर्ज करना आवश्यक है:

mysql> insert into test_table(stamp_created, stamp_updated) values(null, null); 
Query OK, 1 row affected (0.06 sec)
mysql> select * from t5; 
+----+---------------------+---------------------+ 
| id | stamp_created       | stamp_updated       |
+----+---------------------+---------------------+
|  2 | 2009-04-30 09:44:35 | 2009-04-30 09:44:35 |
+----+---------------------+---------------------+
2 rows in set (0.00 sec)  
mysql> update test_table set id = 3 where id = 2; 
Query OK, 1 row affected (0.05 sec) Rows matched: 1  Changed: 1  Warnings: 0  
mysql> select * from test_table;
+----+---------------------+---------------------+
| id | stamp_created       | stamp_updated       | 
+----+---------------------+---------------------+ 
|  3 | 2009-04-30 09:44:35 | 2009-04-30 09:46:59 | 
+----+---------------------+---------------------+ 
2 rows in set (0.00 sec) 

16

वास्तव में एक कार्यान्वयन दोष।

MySQL में मूल दृष्टिकोण एक निर्माण तिथि को स्वयं अपडेट करना है (यदि आपको एक की आवश्यकता है) और MySQL को टाइमस्टैम्प update date ? update date : creation date जैसी चिंता है:

CREATE TABLE tracked_data( 
  `data` TEXT,
  `timestamp`   TIMESTAMP,
  `creation_date` TIMESTAMP                                   
) ENGINE=INNODB; 

सृजन पर NULL डालें:

INSERT INTO tracked_data(`data`,`creation_date`) VALUES ('creation..',NULL);

टाइमस्टैम्प के लिए पूर्ण मान डिफ़ॉल्ट रूप से CURRENT_TIMESTAMP के रूप में इंटरप्रिट किए जाते हैं।

MySQL में किसी तालिका के पहले TIMESTAMP स्तंभ को दोनों DEFAULT CURRENT_TIMESTAMPऔर ON UPDATE CURRENT_TIMESTAMPविशेषता मिलती है , यदि इसके लिए कोई विशेषता नहीं दी जाती है। यही कारण है कि विशेषताओं के साथ TIMESTAMP कॉलम पहले आना चाहिए या आपको इस थ्रेड में वर्णित त्रुटि मिलती है।


14
  1. डेटा प्रकार के कॉलम को डेटाइम में बदलें
  2. ट्रिगर सेट करें

जैसे कि:

DROP TRIGGER IF EXISTS `update_tablename_trigger`;
DELIMITER //
CREATE TRIGGER `update_tablename_trigger` BEFORE UPDATE ON `tablename`
 FOR EACH ROW SET NEW.`column_name` = NOW()
//
DELIMITER ;

मैंने हमेशा इस पद्धति को आधे कार्यान्वित CURRENT_TIMESTAMP कार्यक्षमता की तुलना में बहुत कम जानलेवा माना है।
टिहरी

1

खैर आपके लिए एक फिक्स इसे अपडेटेड फील्ड पर रखा जा सकता है और इसमें एक ट्रिगर है जो कि एडेड फील्ड को अपडेटडेट वैल्यू के साथ अपडेट करता है, अगर केवल एडेड डेट शून्य है।


1

विभिन्न उत्तरों का संयोजन:

MySQL 5.5 में, DEFAULT CURRENT_TIMESTAMPऔर केवल पर ही ON UPDATE CURRENT_TIMESTAMPनहीं जोड़ा जा सकता है ।DATETIMETIMESTAMP

नियम:

1) TIMESTAMPप्रति तालिका में अधिकतम एक कॉलम स्वचालित रूप से (या मैन्युअल रूप से [ मेरा जोड़] हो सकता है ]) वर्तमान तिथि और समय के अनुसार प्रारंभ या अद्यतन किया जा सकता है। (MySQL डॉक्स)।

तो केवल एक में या TIMESTAMPहो सकता CURRENT_TIMESTAMPहैDEFAULTON UPDATE खंड

2) NOT NULL TIMESTAMPबिना किसी स्पष्ट DEFAULTमूल्य के पहले कॉलम को स्पष्ट created_date timestamp default '0000-00-00 00:00:00'रूप से एक दिया जाएगा DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPऔर इसलिए बाद के TIMESTAMPकॉलमों CURRENT_TIMESTAMPको DEFAULTया ON UPDATEखंड पर नहीं दिया जा सकता है

CREATE TABLE `address` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `village` int(11) DEFAULT NULL,
    `created_date` timestamp default '0000-00-00 00:00:00', 

    -- Since explicit DEFAULT value that is not CURRENT_TIMESTAMP is assigned for a NOT NULL column, 
    -- implicit DEFAULT CURRENT_TIMESTAMP is avoided.
    -- So it allows us to set ON UPDATE CURRENT_TIMESTAMP on 'updated_date' column.
    -- How does setting DEFAULT to '0000-00-00 00:00:00' instead of CURRENT_TIMESTAMP help? 
    -- It is just a temporary value.
    -- On INSERT of explicit NULL into the column inserts current timestamp.

-- `created_date` timestamp not null default '0000-00-00 00:00:00', // same as above

-- `created_date` timestamp null default '0000-00-00 00:00:00', 
-- inserting 'null' explicitly in INSERT statement inserts null (Ignoring the column inserts the default value)! 
-- Remember we need current timestamp on insert of 'null'. So this won't work. 

-- `created_date` timestamp null , // always inserts null. Equally useless as above. 

-- `created_date` timestamp default 0, // alternative to '0000-00-00 00:00:00'

-- `created_date` timestamp, 
-- first 'not null' timestamp column without 'default' value. 
-- So implicitly adds DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP. 
-- Hence cannot add 'ON UPDATE CURRENT_TIMESTAMP' on 'updated_date' column.


   `updated_date` timestamp null on update current_timestamp,

  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=132 DEFAULT CHARSET=utf8;

INSERT INTO address (village,created_date) VALUES (100,null);

mysql> select * from address;
+-----+---------+---------------------+--------------+
| id  | village | created_date        | updated_date |
+-----+---------+---------------------+--------------+
| 132 |     100 | 2017-02-18 04:04:00 | NULL         |
+-----+---------+---------------------+--------------+
1 row in set (0.00 sec)

UPDATE address SET village=101 WHERE village=100;

mysql> select * from address;
+-----+---------+---------------------+---------------------+
| id  | village | created_date        | updated_date        |
+-----+---------+---------------------+---------------------+
| 132 |     101 | 2017-02-18 04:04:00 | 2017-02-18 04:06:14 |
+-----+---------+---------------------+---------------------+
1 row in set (0.00 sec)

अन्य विकल्प (लेकिन updated_dateपहला कॉलम है):

CREATE TABLE `address` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `village` int(11) DEFAULT NULL,
  `updated_date` timestamp null on update current_timestamp,
  `created_date` timestamp not null , 
  -- implicit default is '0000-00-00 00:00:00' from 2nd timestamp onwards

  -- `created_date` timestamp not null default '0000-00-00 00:00:00'
  -- `created_date` timestamp
  -- `created_date` timestamp default '0000-00-00 00:00:00'
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=132 DEFAULT CHARSET=utf8;

0

इसे इस्तेमाल करे:

CREATE TABLE `test_table` (
`id` INT( 10 ) NOT NULL,
`created_at` TIMESTAMP NOT NULL DEFAULT 0,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE = INNODB;

3
यह काम करेगा लेकिन यह समस्या को हल नहीं करता है। create_at 0 है जो बेकार है।
CompEng88

@ ComputerEngineer88 पुराने mysql सर्वर के लिए यह सही समाधान है। आपको created_atकॉलम स्वयं सेट करना चाहिए । मुझे लगता है कि यह वही है जो जानबूझकर कहना चाहता है।
रोजर

यह वास्तव में आधिकारिक समाधान है, यहाँ दस्तावेज dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html
Rangi Lin

0

यह MYSQL 5.5 संस्करण में सीमा है। आपको संस्करण को 5.6 पर अपडेट करना होगा।

Error

मुझे यह त्रुटि MYSQL में एक तालिका जोड़ने में मिल रही थी

गलत तालिका परिभाषा; DEFAULT में CURRENT_TIMESTAMP के साथ केवल एक TIMESTAMP कॉलम हो सकता है या मेरा MYSQL का अद्यतन खंड हो सकता है

तालिका कुछ इस तरह दिखती है।

बनाने की तालिका table_name (col1 int (5) auto_increment प्राथमिक कुंजी, col2 varchar (300), col3 varchar (500), col4 int (3), col5 टिंटिंट (2), col6 टाइमस्टैम्प current_timestamp, col7 टाइमस्टैम्प डिफ़ॉल्ट current_timestamp को अपडेट करें current_timestamp। col8 टिनींट (1) डिफॉल्ट 0, कोल 9 टिनींट (1) डिफॉल्ट 1);

कुछ समय के बाद अलग-अलग MYSQL संस्करणों में परिवर्तन और कुछ गोग्लिंग के बारे में पढ़ना। मुझे पता चला कि कुछ बदलाव थे जो MYSQL संस्करण 5.6 में संस्करण 5.5 पर किए गए थे।

यह आलेख समस्या को हल करने में आपकी सहायता करेगा। http://www.oyewiki.com/MYSQL/Incorrect-table-definition-there-can-be-only-one-timestamp-column

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.