আপনি কীভাবে কোনও মাইএসকিউএল ডেটটাইম কলামের জন্য একটি ডিফল্ট মান সেট করবেন?
এসকিউএল সার্ভারে এটি getdate()
। মাইএসকিউএল এর সমতুল্য কী? আমি মাইএসকিউএল 5.x ব্যবহার করছি যদি এটি একটি ফ্যাক্টর হয়।
আপনি কীভাবে কোনও মাইএসকিউএল ডেটটাইম কলামের জন্য একটি ডিফল্ট মান সেট করবেন?
এসকিউএল সার্ভারে এটি getdate()
। মাইএসকিউএল এর সমতুল্য কী? আমি মাইএসকিউএল 5.x ব্যবহার করছি যদি এটি একটি ফ্যাক্টর হয়।
উত্তর:
গুরুত্বপূর্ণ সম্পাদনা: মাইএসকিউএল 5.6.5 থেকে এখন থেকে DATETIME ক্ষেত্রগুলি দিয়ে এটি অর্জন করা সম্ভব , নীচের অন্যান্য পোস্টে একবার দেখুন ...
পূর্ববর্তী সংস্করণগুলি DATETIME দিয়ে তা করতে পারে না ...
তবে আপনি এটি টাইমস্ট্যাম্প দিয়ে করতে পারেন:
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>
** ক্যাভেট: যদি আপনি ডিফল্ট হিসাবে CURRENT_TIMESTAMP সহ একটি কলাম সংজ্ঞায়িত করেন তবে আপনাকে এই কলামটির জন্য সর্বদা একটি মান নির্দিষ্ট করতে হবে বা মানটি স্বয়ংক্রিয়ভাবে আপডেটে "এখন ()" এ পুনরায় সেট হবে। এর অর্থ হ'ল যদি আপনি মানটি পরিবর্তন করতে না চান তবে আপনার আপডেটের বিবৃতিতে অবশ্যই "[আপনার কলামের নাম] = [আপনার কলামের নাম]" (বা অন্য কোনও মান) থাকতে হবে বা মানটি "এখন ()" হয়ে যাবে। অদ্ভুত, তবে সত্য। আশা করি এটা কাজে লাগবে. আমি 5.5.56-মারিয়াডিবি ব্যবহার করছি **
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- હવે-finally- উপলভ্য html
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
মাইএসকিউএল ( সংস্করণ 5.6.5 এর আগে ) ডিফল্ট ডেটটাইম মানগুলির জন্য ফাংশনগুলি ব্যবহার করার অনুমতি দেয় না। TIMESTAMP এর স্বতন্ত্র আচরণের কারণে উপযুক্ত নয় এবং ইনপুট ডেটা হিসাবে ব্যবহারের জন্য প্রস্তাবিত নয়। ( মাইএসকিউএল ডেটা টাইপ ডিফল্ট দেখুন ))
এটি বলেছিল, আপনি একটি ট্রিগার তৈরি করে এটি সম্পাদন করতে পারেন ।
ডেটটাইম টাইপের একটি ডেটক্রিটযুক্ত ক্ষেত্র সহ আমার একটি টেবিল রয়েছে। আমি সেই টেবিলে "Beforeোকানোর আগে" এবং " 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 INTO tblMyTable(name, dateAdded) VALUES('Alice', '2010-01-03 04:30:43');
যা ঘটে তা হ'ল ক্ষেত্রটির জন্য আপনার প্রদত্ত মানটি তাত্ক্ষণিকভাবে ওভাররাইট করে, এবং সুতরাং একটি অ-বর্তমান সময় নির্ধারণের একমাত্র উপায় হ'ল ফলোআপ আপডেট আপডেট - ইয়াক! যখন কোনও মান সরবরাহ করা হয় তখন এই আচরণটি ওভাররাইড করতে, IFNULL অপারেটরের সাথে এই সামান্য পরিবর্তিত ট্রিগার চেষ্টা করুন:
CREATE TRIGGER myTable_OnInsert BEFORE INSERT ON `tblMyTable`
FOR EACH ROW SET NEW.dateAdded = IFNULL(NEW.dateAdded, NOW());
এটি উভয় বিশ্বের সেরা দেয়: আপনি আপনার তারিখ কলামের জন্য একটি মান সরবরাহ করতে পারেন এবং এটি গ্রহণ করবে এবং অন্যথায় এটি বর্তমান সময়ে ডিফল্ট হবে। এটি এখনও টেবিল সংজ্ঞায় ডেফেল্ট গেটডেট () এর মতো পরিষ্কার কিছু সম্পর্কিত ঘেটো, তবে আমরা আরও কাছে চলেছি!
NULL
। আর কোনও সতর্কতা নেই।
dateAdded
ট্রিগারটি ব্যবহার করে সমস্ত '0000-00-00 00:00:00' প্রদর্শিত হবে। এটি ব্যবহার করে কৌতুকটি করা হয়: E প্রতি সারির জন্য যদি NEW.dateAdded = 0 তবে সেট করুন NEW.dateAdded = এখন (); সমাপ্তি 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;
আপনি এখন () ফাংশনটি কাজ করার প্রত্যাশা যেমন করেন তেমন এটি কাজ করে। নালগুলি সন্নিবেশ করা বা তৈরি_ডিটি এবং আপডেট_ডিটি ক্ষেত্রগুলি উপেক্ষা করার ফলে উভয় ক্ষেত্রেই একটি নিখুঁত টাইমস্ট্যাম্প মান হয়। সারিটির যে কোনও আপডেটের আপডেট_ডিটি পরিবর্তন হয়। আপনি যদি মাইএসকিউএল ক্যোয়ারী ব্রাউজারের মাধ্যমে রেকর্ডগুলি সন্নিবেশ করেন তবে আপনার আরও একটি ধাপ প্রয়োজন, নতুন টাইমস্ট্যাম্পের সাহায্যে তৈরি_ডিটি হ্যান্ডেল করার জন্য একটি ট্রিগার দরকার।
CREATE TRIGGER trig_test_table_insert BEFORE INSERT ON `test_table`
FOR EACH ROW SET NEW.created_dt = NOW();
ট্রিগারটি আপনি যা চান তা হতে পারে আমি নামকরণের কনভেনশনটি পছন্দ করি [ট্রিবি] _ [আমার_সারণযোগ্য_নাম] _ [sertোকান]
আপনি এই ধরণের স্টাফ করতে ট্রিগারগুলি ব্যবহার করতে পারেন।
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;
যারা মাইএসকিউএলে একটি ডিফল্ট DATETIME মান সেট করার চেষ্টা করে হৃদয় হারাতে পেরেছিলেন তাদের জন্য , আপনি ঠিক কীভাবে অনুভব করেছেন / অনুভব করেছেন তা আমি জানি। সুতরাং এখানে:
ALTER TABLE `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0
সাবধানতার সাথে লক্ষ্য করুন যে আমি 0 এর আশেপাশে একক উদ্ধৃতি / ডাবল উদ্ধৃতি যোগ করিনি
আমি এটিকে সমাধান করার পরে আক্ষরিকভাবে লাফিয়ে যাচ্ছি: ডি
ALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
মাইএসকিউএল 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';
এটি সত্যই ভয়াবহ সংবাদ। এখানে এটির জন্য একটি দীর্ঘ মুলতুবি বাগ / বৈশিষ্ট্য অনুরোধ । সেই আলোচনাটি টাইমস্ট্যাম্প ডেটা টাইপের সীমাবদ্ধতা সম্পর্কেও কথা বলে।
আমি বিষয়টি গুরুত্ব সহকারে ভাবছি যে এই জিনিসটি বাস্তবায়িত হওয়ার সাথে সাথে সমস্যাটি কী।
আমি মাইএসকিএল সার্ভার 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'
শুধু কাজ করে ।
হিসেবে sidenote , এটা উল্লেখ করা হয় মাইএসকিউএল ডক্স :
তারিখের অংশ সহ মানগুলির জন্য DATE প্রকারটি ব্যবহৃত হয় তবে সময় অংশ হয় না। মাইএসকিউএল 'YYYY-MM-DD' ফর্ম্যাটে তারিখের মানগুলি উদ্ধার করে এবং প্রদর্শন করে। সমর্থিত ব্যাপ্তি '1000-01-01' থেকে '9999-12-31'।
এমনকি যদি তারা বলে:
অবৈধ তারিখ, 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
"টাইমস্ট্যাম্প ডেটা টাইপের '1970-01-01 00:00:01' ইউটিসি থেকে ' 2038-01-19 03:14:07 ' ইউটিসি এর ব্যাপ্তি রয়েছে My এটি মাইএসকিউএল সংস্করণ এবং এসকিউএল উপর নির্ভর করে বিভিন্ন বৈশিষ্ট্যযুক্ত রয়েছে সার্ভারটি মোডে চলছে These এই বিভাগগুলিতে এই বৈশিষ্ট্যগুলি পরে বর্ণিত। "
সুতরাং এটি প্রায় 28 বছরের মধ্যে আপনার সফ্টওয়্যারটি স্পষ্টতই ভেঙে ফেলবে।
আমি বিশ্বাস করি ডাটাবেস সাইডের একমাত্র সমাধান হ'ল অন্যান্য উত্তরে উল্লিখিত মত ট্রিগারগুলি ব্যবহার করা।
মাল্টি-লাইন ট্রিগারগুলি সংজ্ঞায়িত করার সময় একজনকে ডিলিমিটার পরিবর্তন করতে হবে কারণ মাইএসকিউএল সংকলক দ্বারা ট্রিগারের শেষে এবং ত্রুটি উত্পন্ন করার জন্য সেমিকোলন গ্রহণ করবে। যেমন
DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
-- Set the udpate date
Set new.UpdateDate = now();
END//
DELIMITER ;
এটি মাইএসকিউএল 5.1 এ কীভাবে করবেন তা এখানে রয়েছে:
ALTER TABLE `table_name` CHANGE `column_name` `column_name`
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;
আপনাকে কলামের নামটি কেন দুবার প্রবেশ করতে হবে তা সম্পর্কে আমার কোনও ধারণা নেই।
আপনি যদি এখনই ডিফল্ট মান সেট করার চেষ্টা করছেন (), আমার মনে হয় না যে মাইএসকিউএল এটি সমর্থন করে। মাইএসকিউএলে, আপনি টাইমস্ট্যাম্প ডেটা টাইপ কলাম ব্যতীত যে কোনও ধরণের কলামের জন্য ডিফল্ট মান হিসাবে কোনও ফাংশন বা এক্সপ্রেশন ব্যবহার করতে পারবেন না, যার জন্য আপনি ডিফল্ট হিসাবে CURRENT_TIMESTAMP নির্দিষ্ট করতে পারেন।
আমি মাইএসকিএল-তে সহজ মনে করি যেহেতু মাইএসকিএল-র ইনবিল্ট ফাংশনটি এখন () যা বর্তমান সময় (সেই সন্নিবেশের সময়) দেয়।
সুতরাং আপনার প্রশ্নের অনুরূপ দেখতে হবে
CREATE TABLE defaultforTime(
`creation_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`modification_time` DATETIME default now()
);
ধন্যবাদ.
CREATE TABLE `testtable` (
`id` INT(10) NULL DEFAULT NULL,
`colname` DATETIME NULL DEFAULT '1999-12-12 12:12:12'
)
'টেস্টেবল' তৈরি করতে উপরের ক্যোয়ারিতে, আমি DATETIME কলামের ডিফল্ট মান হিসাবে '1999-12-12 12:12:12' ব্যবহার করেছি colname
নিম্নলিখিত কোড ব্যবহার করুন
DELIMITER $$
CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
BEGIN
SET new.datefield = NOW();
END $$
DELIMITER ;
আপনি যদি এখন ডিফল্ট মান সেট করার চেষ্টা করছেন (), মাইএসকিউএল সমর্থন করে যে আপনাকে DATETIME এর পরিবর্তে সেই কলামের টাইমস্ট্যাম্প পরিবর্তন করতে হবে। টাইমস্ট্যাম্পের ডিফল্ট হিসাবে বর্তমান তারিখ এবং সময় রয়েছে..আমি মনে করি এটি আপনার সমস্যার সমাধান করবে ..
উদাহরণস্বরূপ বিবেচনা করুন যদি আমার কাছে 'সাইটের' নামের একটি সারণী থাকে যেখানে একটি ক্রিয়েট_ইট এবং একটি আপডেট_এ্যাট কলাম থাকে যা DATETIME উভয়ই ছিল এবং এখনকার ডিফল্ট মানের প্রয়োজন হয় তবে আমি এটি অর্জনের জন্য নিম্নলিখিত স্ক্যুএল সম্পাদন করতে পারি।
টেবিলের `সাইট-পরিবর্তন` তৈরি_আট` _ তৈরি_এটি সময়সীম খালি করল নয়; টাইমস্ট্যাম্প; টেবিলের `সাইট-পরিবর্তন` তৈরি_আট` `তৈরি_তাই তারিখটি নাল ডিফল্ট নাল; টেবিল `সাইট-পরিবর্তন` আপডেট_ট` `আপডেট_টাইম টাইমস্ট্যাম্প বাতিল ডিফল্ট ক্রস নয়; টাইমস্ট্যাম্প; টেবিল AB সাইট-পরিবর্তন `আপডেট_ট`` আপডেট_এটি তারিখের নাল ডিফল্ট নাল;
বিবৃতিগুলির ক্রমটি গুরুত্বপূর্ণ কারণ একটি সারণীতে CUREENT টাইমস্ট্যাম্পের ডিফল্ট মানগুলির সাথে টাইমস্ট্যাম্প টাইপের দুটি কলাম থাকতে পারে না
এটি আমার ট্রিগার উদাহরণ:
/************ 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();
মাইএসকিউএল 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;
আপনি ডিফল্ট টাইমস্ট্যাম্প সমাধান করতে পারেন। প্রথমে আপনি কোন অক্ষর সেটটি ব্যবহার করছেন তা বিবেচনা করুন উদাহরণস্বরূপ আপনি যদি uf8 গ্রহণ করেন তবে এই অক্ষর সেটটি সমস্ত ভাষা সমর্থন করে এবং যদি আপনি লেটেন 1 গ্রহণ করেন তবে কেবলমাত্র ইংরেজির জন্য এই অক্ষর সেটটি সমর্থন করে। পরবর্তী সেট আপনি যদি কোনও প্রকল্পের অধীনে কাজ করছেন তবে আপনার ক্লায়েন্ট সময় অঞ্চলটি জানা উচিত এবং আপনি ক্লায়েন্ট অঞ্চল হিসাবে নির্বাচন করুন। এই পদক্ষেপটি বাধ্যতামূলক।