পোস্টগ্রিএসকিউএল-এ আমি কীভাবে একটি টাইমস্ট্যাম্প স্বয়ংক্রিয়ভাবে আপডেট করব


132

আমি চাই যে কোডটি যখন একটি নতুন সারি isোকানো হবে তখন আমি স্বয়ংক্রিয়ভাবে টাইম স্ট্যাম্পটি আপডেট করতে সক্ষম হয়ে CURRENT_TIMESTAMP ব্যবহার করে মাইএসকিউএল করতে পারি।

পোস্টগ্র্রেএসকিউএল এ আমি কীভাবে এটি অর্জন করতে সক্ষম হব?

CREATE TABLE users (
    id serial not null,
    firstname varchar(100),
    middlename varchar(100),
    lastname varchar(100),
    email varchar(200),
    timestamp timestamp
)

6
যাইহোক, আপনার ডেটা প্রকারের timestampএসকিউএল স্পেস দ্বারা সংক্ষিপ্তসার হিসাবে সংজ্ঞায়িত করা হয় TIMESTAMP WITHOUT TIME ZONEপোস্টগ্রিস বিশেষজ্ঞ ডেভিড ই হুইলারের ব্যাখ্যা অনুসারে এটি আপনি যা চান তা প্রায় নয় । অন্য প্রকারটি, TIMESTAMP WITH TIME ZONEসম্ভবত আপনি যা চান, কোনও উত্তীর্ণ টাইম জোনের অফসেট তথ্য ব্যবহার করে তারিখের সময়টি ইউটিসিতে সামঞ্জস্য করে (তবে প্রকৃতপক্ষে টাইপের নাম সত্ত্বেও সেই সময় অঞ্চল তথ্য সংরক্ষণ করে না)।
তুলসী বাউরক

3
এটি আবারও শেখার পরে, আমি ডিফল্ট, ফাংশন এবং ট্রিগার ব্যবহার করে একটি সারি তৈরি এবং পরিবর্তন উভয়ের তারিখ-সময় লগ সম্পর্কে একটি বিস্তারিত ব্লগ পোস্ট লিখেছিলাম । পোস্টগ্রিসে ব্যবহারের জন্য সম্পূর্ণ উদাহরণ এসকিউএল এবং পিএল / পিজিএসকিউএল কোড অন্তর্ভুক্ত করে।
তুলসী বাউরক

উত্তর:


197

Sertোকানোর সময় কলামটি জনপ্রিয় করতে, একটি DEFAULTমান ব্যবহার করুন :

CREATE TABLE users (
  id serial not null,
  firstname varchar(100),
  middlename varchar(100),
  lastname varchar(100),
  email varchar(200),
  timestamp timestamp default current_timestamp
)

মনে রাখবেন যে কলামটির মানটি INSERTবিবৃতিতে একটি মান সরবরাহ করে স্পষ্টভাবে ওভাররাইট করা যেতে পারে । আপনি যদি এটি প্রতিরোধ করতে চান তবে আপনার একটি ট্রিগার দরকার ।

আপনার যখন সারিটি আপডেট করা হবে তখনই কলামটি আপডেট করার দরকার থাকলে আপনার ট্রিগারও প্রয়োজন ( ইজে ব্রেন্নান উল্লেখ করেছেন )

নোট করুন যে কলামের নামগুলির জন্য সংরক্ষিত শব্দ ব্যবহার করা সাধারণত ভাল ধারণা নয়। এর চেয়ে আলাদা নাম খুঁজে পাওয়া উচিতtimestamp


14
সচেতন থাকুন যে পোস্টগ্র্রেসের কার্যকারিতা রয়েছে (1) আসল বর্তমান মুহুর্তের সময়, (২) বিবৃতি শুরু হওয়ার সময় এবং (3) লেনদেন শুরু হওয়ার সময়। এখানে প্রদর্শিত উদাহরণটি হ'ল বর্তমান লেনদেনের সূচনা। অন্য দুটি সম্ভাবনার বিপরীতে আপনি এটি বা নাও চাইতে পারেন।
তুলসী বাউরক

6
সংরক্ষিত শব্দের সাথে সংঘর্ষের নামগুলি এড়ানো সম্পর্কে ভাল বোনাস পয়েন্ট। মনে রাখবেন যে এসকিউএল স্পষ্টটি স্পষ্টভাবে প্রতিশ্রুতি দেয় যে কোনও ট্র্যাকিং আন্ডারস্কোরটি কোনও সংরক্ষিত শব্দ হিসাবে ব্যবহার করবে না। সুতরাং আপনি করতে পারেন timestampমধ্যে timestamp_। আরও ভাল একটি বর্ণনামূলক নাম sucha হতে হবে row_created_
তুলসী বাউরক

প্রথমার্ধটি দ্বিতীয় দিকের অন্যান্য উত্তর (যা সঠিক) উল্লেখ করে যদিও ওপি একেবারে জিজ্ঞাসা করেছিল তা নয়, তবে এটি এখনও বিভ্রান্তিকর। এটি উত্তর হিসাবে গ্রহণ করা উচিত নয়।
এরিক ওয়াং

1
প্রকারের পোস্টগ্রিস ডকুমেন্টেশনে তাই বলে। বাধার কাছে প্রতিবন্ধকতা যাচাই করার জন্য অতিরিক্ত সিপিইউ চক্র রয়েছে, যা পাঠ্যে ঘটে না।
রাহলি

3
একটি ক্ষেত্রের সাথে নয়, তবে আমি একক ক্ষেত্রের সাথে কোনও দরকারী টেবিলটি কখনও দেখিনি। এই সীমাবদ্ধতা ক্ষেত্রের সংখ্যা দ্বারা আরও জটিল হয়। আমার মনে আছে একটি টেবিলের সমস্ত বর্ণের পাঠ্যগুলিতে পরিবর্তন করা এবং 15% লেখার উন্নতি হয়েছে। এছাড়াও, ছোট পারফরম্যান্স পেনাল্টি "NO" পারফরম্যান্স পেনাল্টি নয়।
রাহলি

104

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

http://www.revsys.com/blog/2006/aug/04/automatically-updating-a-timestamp-column-in-postgresql/

CREATE OR REPLACE FUNCTION update_modified_column()   
RETURNS TRIGGER AS $$
BEGIN
    NEW.modified = now();
    RETURN NEW;   
END;
$$ language 'plpgsql';

ট্রিগারটি এভাবে প্রয়োগ করুন:

CREATE TRIGGER update_customer_modtime BEFORE UPDATE ON customer FOR EACH ROW EXECUTE PROCEDURE  update_modified_column();

2
এটি সেরা উত্তর, আইএমও (যদিও, একটি ডিফল্ট সন্নিবেশের জন্য যথেষ্ট পরিমাণে থাকে)।
কিক

2
এখানে নতুন কী?
নবীন


এটি একটি আরও সম্পূর্ণ সমাধান যা প্রাথমিক INSERTs পাশাপাশি কোনও পরবর্তী আপডেটগুলি (ডেটা অডিটিংয়ের জন্য ভাল) সাথে কাজ করবে। মঞ্জুর, ওপি কেবল প্রাক্তনদের জন্য জিজ্ঞাসা করে।
পাভেল লেচেভ

5
@ নতুন কিছু না, তোমার সাথে নতুন কী?
আনডেরেক্স

57

টাইমস্ট্যাম্প আপডেট করা হচ্ছে, মানগুলি পরিবর্তিত হলেই

ইজে-র লিঙ্কের ভিত্তিতে এবং এই লিঙ্কটি থেকে একটি if স্টেটমেন্ট যুক্ত করুন ( https://stackoverflow.com/a/3084254/1526023 )

CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
   IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
      NEW.modified = now(); 
      RETURN NEW;
   ELSE
      RETURN OLD;
   END IF;
END;
$$ language 'plpgsql';

9

'এখন ()' ডিফল্ট মান হিসাবে স্বয়ংক্রিয়ভাবে সময় স্ট্যাম্প উত্পন্ন।

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