টিএল; ডিআর
এখানে এমন একটি সংস্করণ রয়েছে যেখানে কোনও মান পড়তে এবং সেগুলি টাইপ করার জন্য আপনার কোনও মানুষের প্রয়োজন হয় না।
CREATE SEQUENCE foo_a_seq OWNED BY foo.a;
SELECT setval('foo_a_seq', coalesce(max(a), 0) + 1, false) FROM foo;
ALTER TABLE foo ALTER COLUMN a SET DEFAULT nextval('foo_a_seq');
আরেকটি বিকল্প হ'ল Functionএই উত্তরটির শেষে পুনরায় ব্যবহারযোগ্য ভাগ করে নেওয়া নিয়োগ করা ।
একটি অ ইন্টারেক্টিভ সমাধান
উদাহরণস্বরূপ লাইভ-ইশ ডিবি প্যাচিংয়ের সময় আমাদের মধ্যে যারা এইগুলি Sequenceএকটি অ-ইন্টারেক্টিভ স্ক্রিপ্ট দ্বারা তৈরি করা দরকার তাদের জন্য কেবলমাত্র অন্য দুটি জবাব যুক্ত করুন ।
এটি হ'ল, যখন আপনি SELECTমানটি নিজে হাতে পেতে চান না এবং এটিকে পরবর্তী CREATEবিবৃতিতে নিজেকে টাইপ করুন ।
সংক্ষেপে, আপনি এটি করতে পারবেন না :
CREATE SEQUENCE foo_a_seq
START WITH ( SELECT max(a) + 1 FROM foo );
... যেহেতু START [WITH]মধ্যে দফা CREATE SEQUENCEপ্রত্যাবর্তনের একটি মান , না একটি subquery।
নোট: (একটি চলতি নিয়ম, এর সমস্ত অ-টি ককটেলের প্রযোজ্য হিসাবে অর্থাত : ছাড়া আর কিছু INSERT, SELECT, UPDATE, DELETEমধ্যে বিবৃতির) pgSQL আমি যতদূর জানি।
যাইহোক, setval()না! সুতরাং, নিম্নলিখিতটি নিখুঁত:
SELECT setval('foo_a_seq', max(a)) FROM foo;
যদি কোনও ডেটা না থাকে এবং আপনি এটি সম্পর্কে জানতে (চান না), coalesce()ডিফল্ট মান সেট করতে ব্যবহার করুন :
SELECT setval('foo_a_seq', coalesce(max(a), 0)) FROM foo;
তবে, বর্তমান সিকোয়েন্স মান সেট করা 0বেআইনী না হলে আনাড়ি is
এর থ্রি-প্যারামিটার ফর্মটি ব্যবহার setvalকরা আরও উপযুক্ত হবে:
SELECT setval('foo_a_seq', coalesce(max(a), 0) + 1, false) FROM foo;
ঐচ্ছিক তৃতীয় প্যারামিটারটি সেট setvalকরার falseপরের প্রতিরোধ করবে nextvalএকটি মান ফেরার আগে ক্রম আগুয়ান থেকে, এবং এইভাবে:
পরবর্তীটি nextvalনিখুঁতভাবে নির্দিষ্ট মানটি ফেরত দেবে এবং ক্রম অগ্রগতি নিম্নলিখিতটির সাথে শুরু হয় nextval।
- ডকুমেন্টেশনে এই এন্ট্রি থেকে
কোনও সম্পর্কযুক্ত নোটে, আপনি Sequenceসরাসরি কলামটির সাথে কলামটিও নির্দিষ্ট করতে পারবেন CREATE, আপনাকে পরে এটি পরিবর্তন করতে হবে না:
CREATE SEQUENCE foo_a_seq OWNED BY foo.a;
সংক্ষেপে:
CREATE SEQUENCE foo_a_seq OWNED BY foo.a;
SELECT setval('foo_a_seq', coalesce(max(a), 0) + 1, false) FROM foo;
ALTER TABLE foo ALTER COLUMN a SET DEFAULT nextval('foo_a_seq');
ব্যবহার করে একটি Function
বিকল্পভাবে, আপনি যদি একাধিক কলামের জন্য এটি করার পরিকল্পনা করে থাকেন তবে আপনি একটি প্রকৃত ব্যবহারের বিকল্প বেছে নিতে পারেন Function।
CREATE OR REPLACE FUNCTION make_into_serial(table_name TEXT, column_name TEXT) RETURNS INTEGER AS $$
DECLARE
start_with INTEGER;
sequence_name TEXT;
BEGIN
sequence_name := table_name || '_' || column_name || '_seq';
EXECUTE 'SELECT coalesce(max(' || column_name || '), 0) + 1 FROM ' || table_name
INTO start_with;
EXECUTE 'CREATE SEQUENCE ' || sequence_name ||
' START WITH ' || start_with ||
' OWNED BY ' || table_name || '.' || column_name;
EXECUTE 'ALTER TABLE ' || table_name || ' ALTER COLUMN ' || column_name ||
' SET DEFAULT nextVal(''' || sequence_name || ''')';
RETURN start_with;
END;
$$ LANGUAGE plpgsql VOLATILE;
এটি এর মতো ব্যবহার করুন:
INSERT INTO foo (data) VALUES ('asdf');
SELECT make_into_serial('foo', 'a');
INSERT INTO foo (data) VALUES ('asdf');
SERIALসিউডো-টাইপটি এখন লিগ্যাসি , এসকিউএল: 2003 এ পোস্টগ্রিস 10 এবং তারপরে সংজ্ঞায়িত নতুনGENERATED … AS IDENTITYবৈশিষ্ট্য দ্বারা সরবরাহ করা হয়েছে । ব্যাখ্যা দেখুন ।