ডিফল্ট ধারাটিতে CURRENT_TIMESTAMP সহ কেবলমাত্র একটি TIMESTAMP কলাম থাকতে পারে কেন?


180

ডিফল্টে বা ওপেনডিজ ক্লোজের 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

ভুল টেবিল সংজ্ঞা; ডিফল্টে বা আপডেট আপডেটে 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

@ নিকোলাসবুদুরই এছাড়াও যদি প্রথম timestampকলামে একটি সুস্পষ্ট ডিফল্ট মান সেট থাকে তবে তা নয় default '0000-00-00 00:00:00'। কলাম nullable বা স্পষ্টভাবে ডিফল্ট মান সেট করা থাকে, তাহলে এমন DEFAULT CURRENT_TIMESTAMPএবং ON UPDATE CURRENT_TIMESTAMPযোগ করা হবে
user104309

কেন একটি উত্তর দেখতে সত্যিই পছন্দ করবে? কীভাবে এটি কাছাকাছি যাবেন বা কীভাবে এটি এখন ঠিক করা হয়েছে তা নয়। কেন এটি কখনও এভাবে প্রয়োগ করা হয়েছিল? এটি মোট ব্রেন্ডিনড উপায়ে মনে হচ্ছে এবং আমি এই বিধিনিষেধের কোনও কারণ হতে পারে এমন কোনও নকশা / বাস্তবায়ন খুঁজে পাচ্ছি না। আমি কীভাবে বোবা লোকেরা প্রোগ্রাম শিখতে চাই, তাই দয়া করে আমাকে শিখিয়ে দিন।
লোথার

উত্তর:


173

এই সীমাবদ্ধতা, যা শুধুমাত্র historicalতিহাসিক, কোড উত্তরাধিকারের কারণে ছিল, মাইএসকিউএল এর সাম্প্রতিক সংস্করণগুলিতে সরানো হয়েছে:

মাইএসকিউএল 5.6.5 (2012-04-10, মাইলস্টোন 8) এ পরিবর্তনগুলি

পূর্বে, সারণীতে প্রতি সর্বাধিক একটি TIMESTAMP কলামটি স্বয়ংক্রিয়ভাবে বর্তমান তারিখ এবং সময়টিতে আরম্ভ বা আপডেট করা যেতে পারে। এই সীমাবদ্ধতা প্রত্যাহার করা হয়েছে। যে কোনও TIMESTAMP কলাম সংজ্ঞা ডিফল্ট CURRENT_TIMESTAMP এবং আপডেট আপডেট CURRENT_TIMESTAMP অনুচ্ছেদের কোনও সমন্বয় থাকতে পারে। এছাড়াও, এই ধারাগুলি এখন DATETIME কলাম সংজ্ঞা সহ ব্যবহার করা যেতে পারে with আরও তথ্যের জন্য, স্বয়ংক্রিয় সূচনা এবং TIMESTAMP এবং DATETIME- র আপডেট see

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


নীচে নীচে @ মুলি উত্তরও দেখুন। প্রকৃতপক্ষে প্রথম টাইমস্ট্যাম্প কলামটিতে "ডিফল্ট কারেন্ট_টাইমস্ট্যাম্প আপডেট আপডেট কারেন্টটাইমস্ট্যাম্প" স্বয়ংক্রিয়ভাবে সেট হয়ে যায় (সুতরাং এটির নাম আপডেট হওয়া উচিত)) আপনাকে সন্নিবেশের সময় স্রেফ তৈরি_্যাট ম্যানুয়ালি সেট করতে হবে।
গিসমো রানাস

আমরা কী করতে পারি যদি মাইএসকিএল ডাম্পটি 7.7 সংস্করণের হয় এবং সেটআপটি
.4.৪

1
@otc, আপনি ডাম্পটি সম্পাদনা করতে পারেন, বা 5.4 দিয়ে আবার শুরু করতে পারেন
জেসেন

40

আমিও ভাবলাম অনেক আগে ago আমি আমার ইতিহাসে কিছুটা অনুসন্ধান করেছি এবং আমি মনে করি যে এই পোস্টটি: http://lists.mysql.com/internals/34919 মাইএসকিউএলের আধা-সরকারী অবস্থানের প্রতিনিধিত্ব করে (ওরাকলের হস্তক্ষেপের আগে;))

সংক্ষেপে:

এই সীমাবদ্ধতাটি কেবলমাত্র সার্ভারে এই বৈশিষ্ট্যটি প্রয়োগ করা হয়েছে এবং এর অস্তিত্বের জন্য অন্য কোনও কারণ নেই from

সুতরাং তাদের ব্যাখ্যা "কারণ এটি এভাবে প্রয়োগ করা হয়"। খুব বৈজ্ঞানিক শোনাচ্ছে না। আমার ধারণা এটি সব কিছু পুরানো কোড থেকে এসেছে from উপরের থ্রেডে এটির পরামর্শ দেওয়া হয়েছে: "যখন প্রথম টাইমস্ট্যাম্প ক্ষেত্রটি স্বয়ংক্রিয় সেট / আপডেট ছিল তখনই বহন করা"।

চিয়ার্স!


বাহ, সত্যিই দুর্গন্ধযুক্ত। আশা করি আমরা শীঘ্রই একটি সংশোধন দেখতে পাই
BoltClock

46
আমাদের উপভোগ করার জন্য আর একটি দুর্দান্ত মাইএসকিউএল সীমাবদ্ধতা!
নিকোলাস বুদুরই

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

প্রকৃতপক্ষে একটি বাস্তবায়ন দোষ।

মাইএসকিউএল-এর নেটিভ অ্যাপ্রোচ হ'ল নিজেকে তৈরির তারিখ আপডেট করা (যদি আপনার প্রয়োজন হয়) এবং মাইএসকিউএলকে যেমন টাইমস্ট্যাম্প সম্পর্কে উদ্বিগ্ন হতে হবে update date ? update date : creation date:

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

তৈরি করার সময় নূলে sertোকান:

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

টাইমস্ট্যাম্পের জন্য নাল মানগুলি ডিফল্টরূপে CURRENT_TIMESTAMP হিসাবে স্বাক্ষরিত হয়।

মাইএসকিউএলে কোনও টেবিলের প্রথম 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

বিভিন্ন উত্তর একত্রিত:

মাইএসকিউএল 5.5 এ, DEFAULT CURRENT_TIMESTAMPএবং কেবলমাত্র ON UPDATE CURRENT_TIMESTAMPযোগ করা যায় না ।DATETIMETIMESTAMP

নিয়মাবলী:

1) TIMESTAMPসারণীতে প্রতি সর্বাধিক এক কলামটি স্বয়ংক্রিয়ভাবে (বা ম্যানুয়ালি [ আমার সংযোজন ]) বর্তমান তারিখ এবং সময়টিতে আরম্ভ বা আপডেট হতে পারে। (মাইএসকিউএল ডক্স)

সুতরাং শুধুমাত্র এক TIMESTAMPথাকতে পারে CURRENT_TIMESTAMPমধ্যে DEFAULTবা ON 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
এটি কাজ করবে তবে সমস্যাটি সমাধান করে না। তৈরি_এটি 0 যা এক ধরণের অকেজো।
সংযুক্ত করুন 88

@ ComputerEngineer88 এটি পুরানো মাইএসকিএল সার্ভারের জন্য সঠিক সমাধান। আপনার created_atনিজেরাই কলামটি সেট করা উচিত । আমি মনে করি এটি অপ্টটি ইচ্ছাকৃতভাবে বলতে চায়।
রজার

এটি হ'ল সরকারী সমাধান, এখানে ডকুমেন্ট করা হয়েছে dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html
রাঙ্গি লিন

0

এটি এমওয়াইএসকিউএল 5.5 সংস্করণে সীমাবদ্ধতা। আপনাকে সংস্করণটি 5.6 এ আপডেট করতে হবে।

Error

এমওয়াইএসকিউএলে একটি সারণী যুক্ত করার সময় আমি এই ত্রুটিটি পেয়েছিলাম

ভুল টেবিল সংজ্ঞা; ডিফল্টে বা আপডেট আপডেটে আমার নতুন এমওয়াইএসকিউএলে CURRENT_TIMESTAMP এর সাথে কেবলমাত্র একটি TIMESTAMP কলাম থাকতে পারে

টেবিলটি এরকম কিছু দেখাচ্ছে।

সারণী সারণী_নাম তৈরি করুন (কল 1 ইন্টি (5) স্বতঃআবরণপ্রক্রিয়া প্রাথমিক কী, কল 2 বারচর (300), কল 3 বার্তা (500), কল 4 ইন্ট (3), কল 5 টিইনিন্ট (2), কল 6 টাইমস্ট্যাম্প ডিফল্ট বর্তমান_টাইমস্ট্যাম্প, কল 7 টাইমস্ট্যাম্প ডিফল্ট বর্তমান_টাইম স্ট্যাম্প আপডেট_টাইমস্ট্যাম্প, কল 8 টিনিয়েন্ট (1) ডিফল্ট 0, কল 9 টিইনিন্ট (1) ডিফল্ট 1);

বিভিন্ন এমওয়াইএসকিউএল সংস্করণ এবং কিছু গুগলিং সম্পর্কে পরিবর্তনগুলি পড়ার কিছু সময় পরে। আমি জানতে পেরেছিলাম যে এমআইএসকিউএল সংস্করণ 5.5 সংস্করণ 5.5 এর ওপরে কিছু পরিবর্তন হয়েছে।

এই নিবন্ধটি আপনাকে সমস্যাটি সমাধান করতে সহায়তা করবে। http://www.oyewiki.com/MYSQL/Incorrect-table-definition-there-can-be-only-one-timestamp-column

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.