আপনি কীভাবে কোনও মাইএসকিউএল ডেটটাইম কলামের জন্য একটি ডিফল্ট মান সেট করবেন?


896

আপনি কীভাবে কোনও মাইএসকিউএল ডেটটাইম কলামের জন্য একটি ডিফল্ট মান সেট করবেন?

এসকিউএল সার্ভারে এটি getdate()। মাইএসকিউএল এর সমতুল্য কী? আমি মাইএসকিউএল 5.x ব্যবহার করছি যদি এটি একটি ফ্যাক্টর হয়।


4
আমি আমার মাইএসকিএল টেবিলটিতে CURRENT_TIMESTAMP ব্যবহার করি (কোয়েরিতে নেই), সম্ভবত এটিও সহায়ক হতে পারে।
রুবেন

15
এই বৈশিষ্ট্যটি এখন মাইএসকিউএল 5.6.5 এ যুক্ত করা হয়েছে। আশা করি এটি কাউকে সাহায্য করবে। অপ্টিমাইজ-
this.blogspot.co.uk/2012/04/…

@ গুস্টইন দ্যসিকিউরশেল এটি ইনস্টল করার জন্য বেশিরভাগ মিশন, কমপক্ষে দেবিয়ানে, তবে অবশ্যই একটি দুর্দান্ত বৈশিষ্ট্য। আমি মনে করি অবশেষে এই "দুটি CURRENT_TIMESTAMP" প্রশ্নগুলি বাদ দেওয়া হবে!
মার্ক ডিমিলো

এটি এখন () ফাংশন বা অন্যথায় আপনি কলাম স্তরে ডিফল্ট সেটিংসের সাথে করতে পারেন।
আনশুল শর্মা

উত্তর:


862

গুরুত্বপূর্ণ সম্পাদনা: মাইএসকিউএল 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-মারিয়াডিবি ব্যবহার করছি **


400
এটা যে DATETIME 1000-9999 একটি পরিসীমা আছে খেয়াল করা জরুরী, কিন্তু টাইমস্ট্যাম্পের জন্য পরিসীমা শুধুমাত্র 1970-2038 হয় । আপনার সিস্টেমের জন্ম তারিখগুলি সংরক্ষণ করতে হয় বা 30 বছরের বন্ধকের জন্য আপনাকে অর্থপ্রদানের পরিকল্পনার মতো কিছু পরিচালনা করতে হয় তবে এটি সমস্যা হতে পারে। dev.mysql.com/doc/refman/5.0/en/datetime.html
কিপ করুন

13
টাইমস্ট্যাম্প সাথেও সাবধান হতে হবে যেমন স্বয়ংক্রিয় আপডেট জাদুর ... পরবর্তী উত্তর দেখার stackoverflow.com/a/1483959/233906
Cerber

6
এটা তোলে হয় সম্ভব সংস্করণ 5.6.5 থেকে, নীচের গুস্তাভ এর উত্তর দেখার (আমি বুঝতে পারছি আপনার উত্তর যখন মাইএসকিউএল এখনো 5.0 ছিল পোস্ট করা হয়েছে!)
E2-E4

4
@ কিপ, হাই, কোনও DATEকলামের জন্য একটি ডিফল্ট মান পাওয়া সম্ভব ? (কোনও datetimeকলাম নয়)।
সজিব আচার্য

তারিখ কলামগুলির জন্য তি সম্ভব হবে বলে মনে হচ্ছে না: আপনাকে DATETIME ডেটা টাইপ ব্যবহার করতে হবে
ফ্যাবিও নেপোডানো

598

সংস্করণ 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


3
'মেনু_ক্রিয়েশন_টাইম'-এর জন্য অবৈধ ডিফল্ট মান
ফার্নান্দো ট্রিন্ডেড

2
@ ফার্নান্দো ট্রিন্ডেডে আপনার মাইএসকিউএল সংস্করণটি .6. later.৫ বা তার পরে প্রয়োজন। আপনি এটি এখানে কাজ করতে দেখতে পান: sqlfiddle.com/#!9/dd2be
গুস্তাভ বার্ট্রাম

1
@ গুস্তাভ বার্ট্রাম, আমি সংস্করণ ৫..6.২২ ব্যবহার করছি, তবে তবুও নিম্নরূপে ত্রুটি পেয়েছি: টেবিল টিবিএল তৈরি করুন (তারিখের তারিখটি ন্যূনতম খালি না হওয়া অবধি, আপডেটের তারিখের টাইমস্ট্যাম্প নূন্যতম হালনাগাদ বাতিল হবে; UR); ত্রুটি কোড: 1294. 'আপডেটের তারিখ' কলামের জন্য আপডেটের ধারা অবৈধ
মণীশ

@ মনিশস্পাল আপনি একটি টাইমস্ট্যাম্প ব্যবহার করছেন, কোনও ডেটটাইম নয়। এছাড়াও, এটি নাল করবেন না make
গুস্তাভ বার্ট্রাম

1
আমি মনে করি "অন আপডেট" সিনট্যাক্সটি ভুল। Dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html এর মতে এটি হওয়া উচিতdt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
ড্যান

148

মাইএসকিউএল ( সংস্করণ 5.6.5 এর আগে ) ডিফল্ট ডেটটাইম মানগুলির জন্য ফাংশনগুলি ব্যবহার করার অনুমতি দেয় না। TIMESTAMP এর স্বতন্ত্র আচরণের কারণে উপযুক্ত নয় এবং ইনপুট ডেটা হিসাবে ব্যবহারের জন্য প্রস্তাবিত নয়। ( মাইএসকিউএল ডেটা টাইপ ডিফল্ট দেখুন ))

এটি বলেছিল, আপনি একটি ট্রিগার তৈরি করে এটি সম্পাদন করতে পারেন ।

ডেটটাইম টাইপের একটি ডেটক্রিটযুক্ত ক্ষেত্র সহ আমার একটি টেবিল রয়েছে। আমি সেই টেবিলে "Beforeোকানোর আগে" এবং " SET NEW.DateCreated=NOW()" একটি ট্রিগার তৈরি করেছি এবং এটি দুর্দান্ত কাজ করে।

আমি এই কারো সাহায্য করে আশা করি।


21
ট্রিগার তৈরি করুন ট্রিগার_ফু_সেট তৈরি করা হয়েছে প্রতিটি সারি জন্য নতুন সংস্থার আগে লিখুন NEW.created_at = ইউটিসি টাইমস্ট্যাম্প ();
কেগ্রিফস 26-25

5
ভবিষ্যতের স্যানিটি (রক্ষণাবেক্ষণ) জন্য ট্রিগারের চেয়ে আপনি সম্ভবত টাইমস্ট্যাম্প ব্যবহার করা ভাল। এটি ট্রিগারটির জন্য খুব ব্যবহারের ক্ষেত্রে তুচ্ছ, যদিও এটি একটি সমাধান।
উইজেট ফরওয়ারস্ট্যাক এক্সচেঞ্জ

8
আপনি সম্ভবত কেবলমাত্র ডিফল্ট মান সেট করতে চাইবেনIF NEW.created_at IS NOT NULL
পেট্র পেলার

132

আমার জন্য ট্রিগার পদ্ধতির সবচেয়ে ভাল কাজ হয়েছে, তবে আমি এই পদ্ধতির সাথে একটি সংঘর্ষ পেয়েছি। সন্নিবেশ করার সময় বর্তমান সময় তারিখের ক্ষেত্র সেট করতে বেসিক ট্রিগারটি বিবেচনা করুন:

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

এটি উভয় বিশ্বের সেরা দেয়: আপনি আপনার তারিখ কলামের জন্য একটি মান সরবরাহ করতে পারেন এবং এটি গ্রহণ করবে এবং অন্যথায় এটি বর্তমান সময়ে ডিফল্ট হবে। এটি এখনও টেবিল সংজ্ঞায় ডেফেল্ট গেটডেট () এর মতো পরিষ্কার কিছু সম্পর্কিত ঘেটো, তবে আমরা আরও কাছে চলেছি!


5
1োকাতে সুস্পষ্ট ব্যবহারকারীর মানগুলি ওভাররাইটিং সহ ক্যাভ্যাটটি স্বীকার করার জন্য +1।
কিপ করুন

2
আমি ব্যক্তিগতভাবে মনে করি এটিই যাওয়ার সেরা উপায়। টাইমস্ট্যাম্পের সত্যই অদ্ভুত আচরণ রয়েছে এবং আমি 2038 বছরের সীমাবদ্ধতার কোডটি কখনই লিখতে পারি না।
এরিক

কিছু মনে করবেন না, আমি এটি বুঝতে পেরেছি। অনুমতি দেওয়ার জন্য ক্ষেত্র সেট করতে ভুলে গেছেন NULL। আর কোনও সতর্কতা নেই।
কাজী

ট্রিগাররা মন্দ! যখন কোনও কিছু করার উপায় না থাকে কেবল তখনই সেগুলি ব্যবহার করুন। ট্রিগার ব্যবহারের চেয়ে 5.6.x আইডিতে আপগ্রেড করা ভাল।
Ksymeon

4
মাইএসকিউএল 5.5 এ আইএফএনএলএল DATETIME এ কাজ করে না; উপরের dateAddedট্রিগারটি ব্যবহার করে সমস্ত '0000-00-00 00:00:00' প্রদর্শিত হবে। এটি ব্যবহার করে কৌতুকটি করা হয়: E প্রতি সারির জন্য যদি NEW.dateAdded = 0 তবে সেট করুন NEW.dateAdded = এখন (); সমাপ্তি IF; `
কেনে

28

আমি আমার টেবিলে এই দুটি পরিবর্তনের বিবৃতি ব্যবহার করে সমাধান করতে সক্ষম হয়েছি যার দুটি ডেটটাইম ক্ষেত্র রয়েছে।

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োকান]


আমি বলতে চাইছিলাম, আপনি যদি মাইএসকিউএল ক্যোয়ারী ব্রাউজারের মাধ্যমে গ্রিডের মাধ্যমে inোকানো () বিবৃতি না দিয়ে ম্যানুয়ালি রেকর্ডস প্রবেশ করান তবে ট্রিগারটির প্রয়োজন। আপনি যদি সর্বদা একটি সন্নিবেশ বিবৃতি ব্যবহার করেন তবে ট্রিগারটি সম্পূর্ণ অপ্রয়োজনীয়।

উপস! আমি বোঝাতে চাইছি ট্রিগার (নাম) আপনি যা খুশি তা হতে পারে কারণ ট্রিগার নামটি কার্যকারিতাটিকে কোনওভাবেই প্রভাবিত করে না। বেশিরভাগ লোকেরা এটি জানবে, তবে মাইএসকিউএলে নতুন কিছু লোক হয়তো জানেন না ...

হাই, লাইনের বিরতি না থাকায় দুঃখিত। প্রতিটি লাইনের শেষ চিহ্নিত করতে আধা-কলোন ব্যবহার করুন।

24

আপনি এই ধরণের স্টাফ করতে ট্রিগারগুলি ব্যবহার করতে পারেন।

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;

18

যারা মাইএসকিউএলে একটি ডিফল্ট DATETIME মান সেট করার চেষ্টা করে হৃদয় হারাতে পেরেছিলেন তাদের জন্য , আপনি ঠিক কীভাবে অনুভব করেছেন / অনুভব করেছেন তা আমি জানি। সুতরাং এখানে:

ALTER TABLE  `table_name` CHANGE `column_name` DATETIME NOT NULL DEFAULT 0

সাবধানতার সাথে লক্ষ্য করুন যে আমি 0 এর আশেপাশে একক উদ্ধৃতি / ডাবল উদ্ধৃতি যোগ করিনি

আমি এটিকে সমাধান করার পরে আক্ষরিকভাবে লাফিয়ে যাচ্ছি: ডি


8
এটি বর্তমান সময় সন্নিবেশ করে না। এটি '0000-00-00 00:00:00' willোকানো হবে।
পিট ডিগার 15 ই

8
আমি এটি বলিনি যে এটি বর্তমান সময় সেট করে। অনেক পিপিএল ছিল / একটি ডিফল্ট শূন্য মান সেট করার চেষ্টা করছে, তবে এটি কার্যকর হয় না। আমাদের উদ্ধৃতিগুলি অপসারণ করা উচিত। যেহেতু এই অনুসন্ধানটি অনেক সময় এবং হতাশার কারণ হয়ে দাঁড়িয়েছিল, তাই আমি এটিকে সম্প্রদায়ের সাথে ভাগ করে নেওয়ার কথা ভেবেছিলাম। আপনার মতো লোকেরা ব্যবহারকারীদের জন্য অন্যান্য লোকের সাথে দরকারী তথ্য ভাগ করে নেওয়ার আগ্রহ হারাতে দায়বদ্ধ। আমি -১ পাওয়ার কোনও কারণ গুরুত্ব সহকারে দেখছি না! যাই হোক.
অগিওয়ান

3
একইটি DATETIME NOT NULL দিয়ে অর্জন করা যেতে পারে।
ব্রেন্ডন বাইার্ড

উদাহরণটি এসকিএল কমান্ডের মধ্যে আরও একটি চরিত্র রয়েছে যা আমি সম্পাদনা করতে পারি না, কারণ এটি কেবলমাত্র একটি চরিত্রের সম্পাদনা।
কোয়াপকা

আপনার কোড আমার পক্ষে কাজ করে নি, এখানে যা কাজ হয়েছেALTER TABLE zones MODIFY created datetime NOT NULL DEFAULT 0;
স্মিথ


14

আপনি যদি ইতিমধ্যে টেবিলটি তৈরি করে থাকেন তবে আপনি ব্যবহার করতে পারেন

ডিফল্ট মান বর্তমান তারিখের সময় পরিবর্তন করতে

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';

13

এটি সত্যই ভয়াবহ সংবাদ। এখানে এটির জন্য একটি দীর্ঘ মুলতুবি বাগ / বৈশিষ্ট্য অনুরোধ । সেই আলোচনাটি টাইমস্ট্যাম্প ডেটা টাইপের সীমাবদ্ধতা সম্পর্কেও কথা বলে।

আমি বিষয়টি গুরুত্ব সহকারে ভাবছি যে এই জিনিসটি বাস্তবায়িত হওয়ার সাথে সাথে সমস্যাটি কী।



9

আমি মাইএসকিএল সার্ভার 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') এর "শূন্য" মান রূপান্তরিত হয়।


8

ডেটটাইম কলামের মান সেট করতে আপনি এখন () ব্যবহার করতে পারেন তবে মনে রাখবেন যে আপনি এটি ডিফল্ট মান হিসাবে ব্যবহার করতে পারবেন না।


4
সত্য। আমি এখনই ব্যবহার করার চেষ্টা করেছি এবং একটি ত্রুটি পেয়েছি "ত্রুটি কোড: 1067. অবৈধ ডিফল্ট মান"। তাহলে উত্তর কি? ;-)
ব্রায়ান বোটরাইট 20

এটি মাইএসকিউএল 5.5 এবং 5.6 সংস্করণে আপোষ করার জন্য সেরা সমাধান। 5.5 সংস্করণে, এর মান নির্ধারণ করুন NOW()এবং এটি সন্নিবেশের জন্য পরে ব্যবহার করুন। সংস্করণ 5.6 এর জন্য, কেবলমাত্র NOW()ডিফল্ট মান হিসাবে সেট করুন ।
আবেল ক্লেলেজো

8

সমাধান হিসাবে 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 বছরের মধ্যে আপনার সফ্টওয়্যারটি স্পষ্টতই ভেঙে ফেলবে।

আমি বিশ্বাস করি ডাটাবেস সাইডের একমাত্র সমাধান হ'ল অন্যান্য উত্তরে উল্লিখিত মত ট্রিগারগুলি ব্যবহার করা।


2
যদি এখন থেকে 20 বছর আগে মাইএসকিউএল আপডেট করা হয় এবং সেই সীমাবদ্ধতাটি সরানো হয় তবে কী হবে? আমি নিশ্চিত যে এটি সম্ভব কিনা তবে কেবল একটি চিন্তাভাবনা।
নেসডান

7

মাল্টি-লাইন ট্রিগারগুলি সংজ্ঞায়িত করার সময় একজনকে ডিলিমিটার পরিবর্তন করতে হবে কারণ মাইএসকিউএল সংকলক দ্বারা ট্রিগারের শেষে এবং ত্রুটি উত্পন্ন করার জন্য সেমিকোলন গ্রহণ করবে। যেমন

DELIMITER //
CREATE TRIGGER `MyTable_UPDATE` BEFORE UPDATE ON `MyTable`
FOR EACH ROW BEGIN
        -- Set the udpate date
    Set new.UpdateDate = now();
END//
DELIMITER ;

5

এটি মাইএসকিউএল 5.1 এ কীভাবে করবেন তা এখানে রয়েছে:

ALTER TABLE `table_name` CHANGE `column_name` `column_name` 
TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP;

আপনাকে কলামের নামটি কেন দুবার প্রবেশ করতে হবে তা সম্পর্কে আমার কোনও ধারণা নেই।


5
ক্ষেত্রটির নামকরণের জন্যও পরিবর্তন রয়েছে। প্রথম কলামের নাম 'পুরাতন', দ্বিতীয় কলামের নাম 'নতুন'। আপনি যদি ক্ষেত্রের নাম পরিবর্তন না করে থাকেন তবে এটি অপ্রয়োজনীয় দেখায়। যদি এটি খুব নান্দনিকভাবে অপছন্দনীয় হয় তবে মোডিফাই চেষ্টা করুন।
জন গর্ডন

5

আপনি যখন DATETIMEডিফল্ট সংজ্ঞা দিয়ে এটি করতে পারবেন না , আপনি কেবল নিজের সন্নিবেশ বিবৃতিতে একটি নির্বাচিত বিবৃতিটি অন্তর্ভুক্ত করতে পারেন:

INSERT INTO Yourtable (Field1, YourDateField) VALUES('val1', (select now()))

টেবিলের চারপাশে উদ্ধৃতিগুলির অভাব নোট করুন।

মাইএসকিউএল 5.5 এর জন্য


3

আপনি যদি এখনই ডিফল্ট মান সেট করার চেষ্টা করছেন (), আমার মনে হয় না যে মাইএসকিউএল এটি সমর্থন করে। মাইএসকিউএলে, আপনি টাইমস্ট্যাম্প ডেটা টাইপ কলাম ব্যতীত যে কোনও ধরণের কলামের জন্য ডিফল্ট মান হিসাবে কোনও ফাংশন বা এক্সপ্রেশন ব্যবহার করতে পারবেন না, যার জন্য আপনি ডিফল্ট হিসাবে CURRENT_TIMESTAMP নির্দিষ্ট করতে পারেন।


3

আমি মাইএসকিএল-তে সহজ মনে করি যেহেতু মাইএসকিএল-র ইনবিল্ট ফাংশনটি এখন () যা বর্তমান সময় (সেই সন্নিবেশের সময়) দেয়।

সুতরাং আপনার প্রশ্নের অনুরূপ দেখতে হবে

CREATE TABLE defaultforTime(
    `creation_time`     DATETIME DEFAULT CURRENT_TIMESTAMP,
    `modification_time` DATETIME default now()
);

ধন্যবাদ.


2
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


1

নিম্নলিখিত কোড ব্যবহার করুন

DELIMITER $$

    CREATE TRIGGER bu_table1_each BEFORE UPDATE ON table1 FOR EACH ROW
    BEGIN
      SET new.datefield = NOW();
    END $$

    DELIMITER ;

0

আপনি যদি এখন ডিফল্ট মান সেট করার চেষ্টা করছেন (), মাইএসকিউএল সমর্থন করে যে আপনাকে DATETIME এর পরিবর্তে সেই কলামের টাইমস্ট্যাম্প পরিবর্তন করতে হবে। টাইমস্ট্যাম্পের ডিফল্ট হিসাবে বর্তমান তারিখ এবং সময় রয়েছে..আমি মনে করি এটি আপনার সমস্যার সমাধান করবে ..


0

উদাহরণস্বরূপ বিবেচনা করুন যদি আমার কাছে 'সাইটের' নামের একটি সারণী থাকে যেখানে একটি ক্রিয়েট_ইট এবং একটি আপডেট_এ্যাট কলাম থাকে যা DATETIME উভয়ই ছিল এবং এখনকার ডিফল্ট মানের প্রয়োজন হয় তবে আমি এটি অর্জনের জন্য নিম্নলিখিত স্ক্যুএল সম্পাদন করতে পারি।

টেবিলের `সাইট-পরিবর্তন` তৈরি_আট` _ তৈরি_এটি সময়সীম খালি করল নয়; টাইমস্ট্যাম্প;

টেবিলের `সাইট-পরিবর্তন` তৈরি_আট` `তৈরি_তাই তারিখটি নাল ডিফল্ট নাল;

টেবিল `সাইট-পরিবর্তন` আপডেট_ট` `আপডেট_টাইম টাইমস্ট্যাম্প বাতিল ডিফল্ট ক্রস নয়; টাইমস্ট্যাম্প;

টেবিল AB সাইট-পরিবর্তন `আপডেট_ট`` আপডেট_এটি তারিখের নাল ডিফল্ট নাল;

বিবৃতিগুলির ক্রমটি গুরুত্বপূর্ণ কারণ একটি সারণীতে CUREENT টাইমস্ট্যাম্পের ডিফল্ট মানগুলির সাথে টাইমস্ট্যাম্প টাইপের দুটি কলাম থাকতে পারে না


0

এটি আমার ট্রিগার উদাহরণ:

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


0

মাইএসকিউএল 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;

-3

আপনি ডিফল্ট টাইমস্ট্যাম্প সমাধান করতে পারেন। প্রথমে আপনি কোন অক্ষর সেটটি ব্যবহার করছেন তা বিবেচনা করুন উদাহরণস্বরূপ আপনি যদি uf8 গ্রহণ করেন তবে এই অক্ষর সেটটি সমস্ত ভাষা সমর্থন করে এবং যদি আপনি লেটেন 1 গ্রহণ করেন তবে কেবলমাত্র ইংরেজির জন্য এই অক্ষর সেটটি সমর্থন করে। পরবর্তী সেট আপনি যদি কোনও প্রকল্পের অধীনে কাজ করছেন তবে আপনার ক্লায়েন্ট সময় অঞ্চলটি জানা উচিত এবং আপনি ক্লায়েন্ট অঞ্চল হিসাবে নির্বাচন করুন। এই পদক্ষেপটি বাধ্যতামূলক।


2
ডেটটাইম কলামগুলির ডিফল্ট মান থাকতে পারে না। এটি 'বৈশিষ্ট্য' নথিভুক্ত। সমস্ত বিকাশকারীদের চরিত্রের এনকোডিং পরিবর্তন করার অ্যাক্সেস নেই। এবং ক্লায়েন্টদের টাইমজোনটিতে সার্ভারটি সেট করা সাধারণত কোনও সম্ভাবনা নয়, বিশেষত যখন ক্লায়েন্টরা একক সময় অঞ্চলে স্থানীয় না হয়।
rlb.usa
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.