pg_get_serial_sequence
ক্রম নাম সম্পর্কে কোনও ভুল অনুমান এড়াতে ব্যবহার করা যেতে পারে। এটি এক শটে ক্রমটি পুনরায় সেট করে:
SELECT pg_catalog.setval(pg_get_serial_sequence('table_name', 'id'), (SELECT MAX(id) FROM table_name)+1);
বা আরও সংক্ষিপ্তভাবে:
SELECT pg_catalog.setval(pg_get_serial_sequence('table_name', 'id'), MAX(id)) FROM table_name;
তবে এই ফর্মটি খালি টেবিলগুলি সঠিকভাবে পরিচালনা করতে পারে না, যেহেতু সর্বোচ্চ (আইডি) নাল, এবং আপনি 0 টি সেটও করতে পারবেন না কারণ এটি ক্রম সীমা ছাড়িয়ে। এর জন্য একটি কর্মসংস্থান হ'ল ALTER SEQUENCE
সিনট্যাক্স অর্থাৎ রিসর্ট করা
ALTER SEQUENCE table_name_id_seq RESTART WITH 1;
ALTER SEQUENCE table_name_id_seq RESTART; -- 8.4 or higher
তবে ALTER SEQUENCE
সীমিত ব্যবহারের কারণ ক্রম নাম এবং পুনঃসূচনা মানটি এক্সপ্রেশন হতে পারে না cannot
এটি setval
"তৃতীয় প্যারামিটার হিসাবে মিথ্যা দিয়ে কল করা সর্বোত্তম উদ্দেশ্য সমাধান হ'ল আমাদের" ব্যবহারের পরবর্তী মান "নির্দিষ্ট করার অনুমতি দেয়:
SELECT setval(pg_get_serial_sequence('t1', 'id'), coalesce(max(id),0) + 1, false) FROM t1;
এটি আমার সমস্ত বাক্সে টিক দেয়:
- আসল ক্রম নামটি হার্ড-কোডিং এড়ানো হয়
- খালি টেবিলগুলি সঠিকভাবে পরিচালনা করে
- বিদ্যমান ডেটা সহ টেবিলগুলি পরিচালনা করে এবং ক্রমের কোনও গর্ত ছেড়ে দেয় না
অবশেষে, নোট করুন যে pg_get_serial_sequence
ক্রমটি কলামের মালিকানাধীন হলে কেবলমাত্র কাজ করে। যদি ইনক্রিমেন্টিং কলামটি কোনও serial
ধরণের হিসাবে সংজ্ঞায়িত করা হয় তবে এটি যদি ক্রমটি ম্যানুয়ালি যুক্ত করা ALTER SEQUENCE .. OWNED BY
হয় তবে এটিও সম্পাদন করা হয়েছে তা নিশ্চিত করা প্রয়োজনীয়।
উদাহরণস্বরূপ যদি serial
টেবিল তৈরির জন্য টাইপ ব্যবহার করা হত, তবে এটি সমস্ত কাজ করা উচিত:
CREATE TABLE t1 (
id serial,
name varchar(20)
);
SELECT pg_get_serial_sequence('t1', 'id'); -- returns 't1_id_seq'
-- reset the sequence, regardless whether table has rows or not:
SELECT setval(pg_get_serial_sequence('t1', 'id'), coalesce(max(id),0) + 1, false) FROM t1;
তবে যদি ক্রমগুলি ম্যানুয়ালি যুক্ত করা হয়:
CREATE TABLE t2 (
id integer NOT NULL,
name varchar(20)
);
CREATE SEQUENCE t2_custom_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER TABLE t2 ALTER COLUMN id SET DEFAULT nextval('t2_custom_id_seq'::regclass);
ALTER SEQUENCE t2_custom_id_seq OWNED BY t2.id; -- required for pg_get_serial_sequence
SELECT pg_get_serial_sequence('t2', 'id'); -- returns 't2_custom_id_seq'
-- reset the sequence, regardless whether table has rows or not:
SELECT setval(pg_get_serial_sequence('t2', 'id'), coalesce(max(id),0) + 1, false) FROM t1;