মাইএসকিউএল ৪.০ এ একটি তৈরি এবং সর্বশেষ আপডেট হওয়া টাইমস্ট্যাম্প কলাম উভয়ই রয়েছে


127

আমার নীচের টেবিলের স্কিমা রয়েছে;

CREATE TABLE `db1`.`sms_queue` (
  `Id` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  `Message` VARCHAR(160) NOT NULL DEFAULT 'Unknown Message Error',
  `CurrentState` VARCHAR(10) NOT NULL DEFAULT 'None',
  `Phone` VARCHAR(14) DEFAULT NULL,
  `Created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `LastUpdated` TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP,
  `TriesLeft` tinyint NOT NULL DEFAULT 3,
  PRIMARY KEY (`Id`)
)
ENGINE = InnoDB;

এটি নিম্নলিখিত ত্রুটির সাথে ব্যর্থ:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause.

আমার প্রশ্ন, আমি কি এই ক্ষেত্র দুটিই পেতে পারি? অথবা প্রতিটি লেনদেনের সময় আমাকে কী ম্যানুয়ালি একটি সর্বশেষতম ক্ষেত্র সেট করতে হবে?


আরে, @ জেনাফ ইয়ান, আপনার কি বর্তমানের ভুলটি থেকে সঠিকভাবে "গৃহীত" উত্তরটি ডানটিতে বদলানো উচিত? এই গ্রহণযোগ্য, ভুল উত্তর আমাকে কী হতে চলেছে তা জানার চেষ্টা করে প্রায় 15 মিনিট হারাতে বাধ্য করে ...
ব্রুনো রিস

1
@ ব্রুনো রিয়েস সম্পন্ন হয়েছে, বাছাই করার জন্য ধন্যবাদ।
জেন্ফ ইয়ান

উত্তর:


128

থেকে মাইএসকিউএল 5.5 ডকুমেন্টেশন :

একটি টেবিলের একটি TIMESTAMP কলামে স্বয়ংক্রিয় আপডেট মান বা উভয়ই কলাম আরম্ভ করার জন্য ডিফল্ট মান হিসাবে বর্তমান টাইমস্ট্যাম্প থাকতে পারে। বর্তমান টাইমস্ট্যাম্পটি একটি কলামের জন্য ডিফল্ট মান এবং অন্য কলামের জন্য স্বতঃ-আপডেট হওয়া সম্ভব নয়।

মাইএসকিউএল 5.6.5 এ পরিবর্তনগুলি :

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


এটি পরিবর্তিত হয়েছে (কমপক্ষে মাইএসকিউএল 5.0 এ)। ডকুমেন্টেশন দেখুন: dev.mysql.com/doc/refman/5.0/en/timestamp.html
সাইমনসিমিটি

@ সিমনসিমসিটি কাউন্টারিং: 5.0 এর নথিতে উপরের মত সঠিক জিনিসটি বলা হয়েছে।
ডেভেমিরন

5
@ রবার্ট গ্যাম্বল আমি মনে করি যে আরও আকর্ষণীয় প্রশ্ন হ'ল কেন তারা চেষ্টা করে না যে তারা খুব সাধারণভাবে অনুরোধ করা / প্রয়োজনীয় কার্যকারিতা করার জন্য কোনও উপায় দেয় নি।
রায়

22
এটি মাইএসকিউএল এর পক্ষ থেকে কিছুটা স্বেচ্ছাচারী বলে মনে হচ্ছে। এই ঘটনাটি কেন কেউ ব্যাখ্যা করতে পারেন ?
humble_coder

12
সত্যিই সত্যিই পুরানো মন্তব্য, কিন্তু, শেষ পর্যন্ত এটি পরিবর্তন করা হয়েছে: Changes in MySQL 5.6.5 (2012-04-10, Milestone 8) Previously, at most one TIMESTAMP column per table could be automatically initialized or updated to the current date and time. This restriction has been lifted. Any TIMESTAMP column definition can have any combination of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses. In addition, these clauses now can be used with DATETIME column definitions. For more information, see Automatic Initialization and Updating for TIMESTAMP and DATETIME.
মরিসিও ভার্গাস

83

দুটি টাইমস্ট্যাম্প থাকার কৌশল আছে তবে কিছুটা সীমাবদ্ধতা রয়েছে।

আপনি একটি টেবিলের মধ্যে কেবল একটি সংজ্ঞা ব্যবহার করতে পারেন। উভয়ের মতো টাইমস্ট্যাম্প কলাম তৈরি করুন:

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() 
); 

নোট করুন যে nullসময়কালে উভয় কলামে প্রবেশ করা প্রয়োজন insert:

mysql> insert into test_table(stamp_created, stamp_updated) values(null, null); 
Query OK, 1 row affected (0.06 sec)

mysql> select * from test_table; 
+----+---------------------+---------------------+ 
| 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)  

মাইএসকিউএল-ডকুমেন্টেশন থেকে এখানে একটি লিঙ্ক রয়েছে যা সেই ফাংশনটি বর্ণনা করে: dev.mysql.com/doc/refman/5.0/en/timestamp.html
সাইমনসিমিটি

6
প্রথম কোড বাক্স, প্রবেশ করার সময় ম্যানুয়ালি আমার জন্য নিখুঁতভাবে কাজ করেছিল। ধন্যবাদ! আমি আশা করি যে আমার উত্তরটি সংরক্ষণ করার মতো যথেষ্ট পরিমাণে 'কর্মফল' ছিল আমার উত্তরটি সংরক্ষণ করার কারণে। মিমি মিম সেভ বেকন
আমাতুসকো

আপনাকে এটি stamp_created নাল নয় হিসাবে সেট করা আছে তা নিশ্চিত করতে হবে । মাইএসকিউএল স্বয়ংক্রিয়ভাবে বর্তমান টাইমস্ট্যাম্পের সাথে NUL প্রতিস্থাপন করবে।
ভ্যালেন্টিন দেশপা

আপনি কেন stamp_createdক্ষেত্রটিকে এইভাবে তৈরি করবেন না : stamp_created timestamp default now()'জিরো' মানটি ব্যবহার করার পরিবর্তে?
সেবাস্তিয়ান শোলে

28

আপনি উভয়ই রাখতে পারেন, তৈরি মাঠে কেবল "CURRENT_TIMESTAMP" পতাকাটি বন্ধ করুন। আপনি যখনই সারণীতে একটি নতুন রেকর্ড তৈরি করবেন, কেবলমাত্র একটি মানের জন্য "এখন ()" ব্যবহার করুন।

অথবা।

বিপরীতে, 'চালু আপডেট CURRENT_TIMESTAMP' পতাকাটি সরান এবং সেই ক্ষেত্রের জন্য এখনই প্রেরণ করুন। যে উপায় আসলে আরও বোধগম্য।


2
এই একমাত্র উপায়? আমি কি এই সমস্ত বিবরণ দেখাবে না ডাটাবেস?
জেনফ ইয়ান

2
মাইএসকিএল ম্যানুয়াল অনুসারে, CURRENT_TIMESTAMP এখন () এর প্রতিশব্দ, তাই আমি মনে করি না এটি কাজ করবে।
tvanfosson

আমি নিশ্চিত যে আপনি এটি করতে পারেন, এটি কেবলমাত্র CURRENT_TIMESTAMP কেবল একটি ক্ষেত্রের জন্য সংরক্ষিত পতাকা। যে কোনও উপায়ে আপনি যদি সেখানে পতাকাটি রেখে থাকেন তবে আপনি যখন কোনও রেকর্ড যুক্ত করবেন তখন সেই ক্ষেত্রটির জন্য আপনার মূল্য কী হবে তা নির্বিশেষে এটি সর্বদা বর্তমান টাইমস্ট্যাম্প, তাই নামটি থাকবে।
স্টিফেন ওয়ালচার 6:48

1
@ ট্যান্ফসন: একটি প্রশ্নের '' NOW () ব্যবহার করে বর্তমান সময় ডাটাবেসে চলে যায়। সেই মানটি আসলে ভাষা, ইঞ্জিন এবং সম্ভবত আমি জানি না এমন আরও একশত জিনিসের উপর নির্ভর করে। আমি যে পতাকাটি উল্লেখ করেছিলাম সেটি সেট করে যাতে যাতে একটি রেকর্ড তৈরি হয়, সময়টি সেই ক্ষেত্রটিতে যুক্ত হয়।
স্টিফেন ওয়ালচার

2
আমি এখনই সন্নিবেশ সন্নিবেশ করিয়েছিলাম (বেশিরভাগ ক্ষেত্রেই) অন্যান্য কোডগুলি এই টেবিলগুলিকে স্পর্শ করতে পারে এবং আমি মানুষকে এগুলি সঠিকভাবে আপডেট করার জন্য বিশ্বাস করি না। :)
জেন্ফ ইয়ান

26

আপনি যদি মাইএসকিউএল টাইমস্ট্যাম্পগুলির আপডেট হ্যান্ডেল করার সিদ্ধান্ত নেন, আপনি sertোকাতে ক্ষেত্রটি আপডেট করতে ট্রিগার সেট করতে পারেন।

CREATE TRIGGER <trigger_name> BEFORE INSERT ON <table_name> FOR EACH ROW SET NEW.<timestamp_field> = CURRENT_TIMESTAMP;

মাইএসকিউএল রেফারেন্স: http://dev.mysql.com/doc/refman/5.0/en/triggers.html


আমি যা খুঁজছিলাম এটি খুব ভাল ছিল। আমি কোয়েরিতে এখনই যুক্ত হওয়া লোকদের উপর নির্ভর করতে চাই না!
বট

আসলে ভালো হতে সন্নিবেশ পর, এবং সেট নতুন হবে <timestamp_field> = নতুন <timestamp_field যে আসলে ডিফল্ট current_timestamp আছে পেয়েছিলাম> এই ভাবে উভয় ক্ষেত্র consistant
KacieHouser

@ ক্যাকিহাউসার নতুন সারির হালনাগাদ করার পরে ট্রিগার হওয়ার অনুমতি নেই
টমাস

23

ট্রিগারগুলি ব্যবহার করে আপনি কীভাবে স্বয়ংক্রিয় এবং নমনীয় ক্রিয়েটডিট / লাস্ট মডিফাইড ফিল্ডগুলি রাখতে পারেন:

প্রথমে তাদের এভাবে সংজ্ঞায়িত করুন:

CREATE TABLE `entity` (
  `entityid` int(11) NOT NULL AUTO_INCREMENT,
  `createDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `lastModified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `name` varchar(255) DEFAULT NULL,
  `comment` text,
  PRIMARY KEY (`entityid`),
)

তারপরে এই ট্রিগারগুলি যুক্ত করুন:

DELIMITER ;;
CREATE trigger entityinsert BEFORE INSERT ON entity FOR EACH ROW BEGIN SET NEW.createDate=IF(ISNULL(NEW.createDate) OR NEW.createDate='0000-00-00 00:00:00', CURRENT_TIMESTAMP, IF(NEW.createDate<CURRENT_TIMESTAMP, NEW.createDate, CURRENT_TIMESTAMP));SET NEW.lastModified=NEW.createDate; END;;
DELIMITER ;
CREATE trigger entityupdate BEFORE UPDATE ON entity FOR EACH ROW SET NEW.lastModified=IF(NEW.lastModified<OLD.lastModified, OLD.lastModified, CURRENT_TIMESTAMP);
  • আপনি যদি ঢোকান উল্লেখ createDate বা lastModified ছাড়াই তারা সমান এবং বর্তমান টাইমস্ট্যাম্প সেট করা হবে।
  • আপনি যদি সেগুলি তারিখগুলি তৈরির তারিখ বা লাস্টমোডাইফাইড না করে আপডেট করে থাকেন তবে সর্বশেষতমিতটি বর্তমান টাইমস্ট্যাম্পে সেট করা হবে।

তবে এখানে সুন্দর অংশটি রয়েছে:

  • আপনি যদি ঢোকান , যদি আপনি একটি নির্দিষ্ট করতে পারেন createDate বর্তমান টাইমস্ট্যাম্প চেয়ে পুরোনো , পুরোনো বার থেকে আমদানির ভাল কাজ করতে সক্ষম হবেন (lastModified createDate সমান হতে হবে)।
  • আপনি যদি আপডেট করেন তবে আপনি আগের মান ('0000-00-00 00:00:00' ভাল কাজ করে) এর চেয়ে পুরনো একটি রূপান্তরিত নির্দিষ্ট করতে পারেন, আপনি যদি প্রসাধনী পরিবর্তনগুলি করে থাকেন তবে কোনও এন্ট্রি আপডেট করার অনুমতি দেয় (একটি মন্তব্যে টাইপ ফিক্সিং ) এবং আপনি পুরানো সর্বশেষতম তারিখটি রাখতে চান । এটি শেষের পরিবর্তিত তারিখটি পরিবর্তন করবে না।

21

মাইএসকিউএল 5.6 এর সহজ প্যাসি হিসাবে ... এটি ব্যবহার করে দেখুন:

create table tweet ( 
    id integer not null auto_increment primary key, 
    stamp_created timestamp default now(), 
    stamp_updated timestamp default now() on update now(),
    message varchar(163)
)

সম্ভবত দুর্দান্ত সমাধান আমি যা অনুসন্ধান করছি তা ট্রিগার ছাড়াই সময় ইস্যু তৈরি এবং আপডেট করুন
ম্যাটিনিকট

আমি বিশ্বাস করতে পারি না যে এই সামান্য উপদ্রবটি সমাধান হতে দীর্ঘ সময় লেগেছে। আমি বুঝতে পারি নি যে তারা এটি স্থির করেছে এবং এটি ২০১ 2018 ... ধন্যবাদ
16:38

4

এই সমস্যাটি মাইএসকিউএল 5.6 এ সমাধান হয়েছে বলে মনে হয়েছে। আমি মাইএসকিউএল 5.5 পর্যন্ত এটি লক্ষ্য করেছি; এখানে একটি উদাহরণ কোড:

DROP TABLE IF EXISTS `provider_org_group` ;
CREATE TABLE IF NOT EXISTS `provider_org_group` (
  `id` INT NOT NULL,
  `name` VARCHAR(100) NOT NULL,
  `type` VARCHAR(100) NULL,
  `inserted` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `insert_src_ver_id` INT NULL,
  `updated` TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP,
  `update_src_ver_id` INT NULL,
  `version` INT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC),
  UNIQUE INDEX `name_UNIQUE` (`name` ASC))
ENGINE = InnoDB;

মাইএসকিউএল 5.5 এ এটি চালনা দেয়:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

এটি মাইএসকিউএল 5.6 এ চলছে

0 row(s) affected   0.093 sec


2

Mysql 5.7.21 এর জন্য আমি নিম্নলিখিতটি ব্যবহার করি এবং সূক্ষ্মভাবে কাজ করে:

টেবিল তৈরি করুন Posts( modified_atটাইমস্ট্যাম্প আপডেট created_atকারেন্টT_TIMESTAMP তারিখের উপরে খালি নয় , বর্তমান সময়সীম , টাইমস্ট্যাম্পটি বাতিল না হওয়া অবধি ক্রমT_TIMESTAMP)


1

আমি মনে করি এটি স্ট্যাম্প_ক্রিয়েটড এবং স্ট্যাম্প_ আপডেটের জন্য আরও ভাল কোয়েরি

CREATE TABLE test_table( 
    id integer not null auto_increment primary key, 
    stamp_created TIMESTAMP DEFAULT now(), 
    stamp_updated TIMESTAMP DEFAULT '0000-00-00 00:00:00' ON UPDATE now() 
); 

কারণ যখন রেকর্ডটি তৈরি করা হয় তখন stamp_createdতা পূরণ করা উচিত now()এবং stamp_updatedতা পূরণ করা উচিত'0000-00-00 00:00:00'


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