পোস্টগ্র্যাগ ম্যানুয়ালি ক্রম পরিবর্তন করে


189

আমি একটি নির্দিষ্ট মানের একটি ক্রম সেট করার চেষ্টা করছি।

SELECT setval('payments_id_seq'), 21, true

এটি একটি ত্রুটি দেয়:

ERROR: function setval(unknown) does not exist

ব্যবহার ALTER SEQUENCEকরে কি কাজ হবে বলে মনে হচ্ছে না?

ALTER SEQUENCE payments_id_seq LASTVALUE 22

কিভাবে এই কাজ করা যেতে পারে?

রেফ: https://www.postgresql.org/docs/current/static/funitions-sequence.html


4
এটি প্রদর্শিত হবে যাতে setval()কমপক্ষে দুটি যুক্তি রয়েছে।

উত্তর:


259

প্রথম বন্ধনীর স্থানটি ভুলভাবে স্থাপন করা হয়েছে:

SELECT setval('payments_id_seq', 21, true);  # next value will be 22

অন্যথায় আপনি setvalএকক যুক্তি দিয়ে কল করছেন , যখন এটির জন্য দুটি বা তিনটি প্রয়োজন।


2
"সত্য" এর শেষ যুক্তির অর্থ কী?
ইনফলকও

15
trueএর অর্থ হল যে পরবর্তী মানটি এই ক্ষেত্রে 22 + প্রদানের সংখ্যা হবে falsemeans এর অর্থ হ'ল পরের মানটি প্রদত্ত সংখ্যা বা 21 হবে default ডিফল্টরূপে সেটওয়াল এমনটি আচরণ করবে যেটি trueবেছে নেওয়া হয়েছিল। আরও বিশদ: postgresql.org/docs/9.6/static/funitions-sequence.html
টম মের্টজ

1
select setvalসিনট্যাক্স ওভারের সুবিধা alter sequenceহ'ল আপনি এতে নেস্টেড ক্যোয়ারী ব্যবহার করতে পারেন, উদাহরণস্বরূপ select max(id) from payments
মারিওটোমো

182

এই সিনট্যাক্সটি পোস্টগ্রিজ এসকিউএল এর কোনও সংস্করণে বৈধ নয় :

ALTER SEQUENCE payments_id_seq LASTVALUE 22

এটি কাজ করবে:

ALTER SEQUENCE payments_id_seq RESTART WITH 22;

এবং এর সমতুল্য:

SELECT setval('payments_id_seq', 22, FALSE);

আরো বর্তমান জন্য ম্যানুয়াল ALTER SEQUENCEএবং ক্রম ফাংশন

নোট যে setval()প্রত্যাশিত হয় (regclass, bigint)বা (regclass, bigint, boolean)। উপরের উদাহরণে আমি টাইপ করা অক্ষর সরবরাহ করছি । এটিও কাজ করে। তবে আপনি যদি ফাংশনটিতে টাইপড ভেরিয়েবলগুলি খাওয়াতে পারেন তবে ফাংশন ধরণের রেজোলিউশন সন্তুষ্ট করার জন্য আপনার স্পষ্টত ধরণের কাস্টের প্রয়োজন হতে পারে । ভালো লেগেছে:

SELECT setval(my_text_variable::regclass, my_other_variable::bigint, FALSE);

পুনরাবৃত্তি ক্রিয়াকলাপগুলির জন্য আপনার আগ্রহী হতে পারে:

ALTER SEQUENCE payments_id_seq START WITH 22; -- set default
ALTER SEQUENCE payments_id_seq RESTART;       -- without value

START [WITH]একটি ডিফল্ট RESTARTনম্বর সঞ্চয় করে , যা RESTARTমূল্য ছাড়াই পরবর্তী কলগুলির জন্য ব্যবহৃত হয়। আপনার শেষ অংশের জন্য 8.4 বা তার পরে পোস্টগ্রিজ দরকার।


4
ALTER SEQUENCE [sequence] RESTART WITH (SELECT MAX(col) from table);কাজ করে না, যেখানে SELECT setval('sequence', (SELECT (MAX(col) from table), TRUE);কাজ করে। আমি একটি সিনট্যাক্স ত্রুটি পেয়েছি। (
পোস্টগ্রেস

1
ডিডিএল কমান্ড ("ইউটিলিটি কমান্ড") এ কোনও উপশমের অনুমতি নেই। দেখুন: স্ট্যাকওভারফ্লো.com
এরউইন ব্র্যান্ডস্টেটার

1
@ মেটালপ্রিটমণি: আপনার টাইপ কাস্টের প্রয়োজন হতে পারে। উপরে যুক্ত নির্দেশাবলী বিবেচনা করুন।
এরউইন ব্র্যান্ডস্টেটার

1
@ নিউক্লিয়ার পিওন আমার মনে হয় আপনি বোঝাতে চাইছেন SELECT setval('sequence', (SELECT MAX(col) from table), TRUE);অন্যথায় আপনার প্যারেনগুলি লাইন আপ করে না।
dland

1
@dland: একপাশে: খাটো ও দ্রুত সমতুল্য: SELECT setval('seq', max(col)) FROM tbl;দেখুন: stackoverflow.com/a/23390399/939860
এরউইন Brandstetter

33

ব্যবহার select setval('payments_id_seq', 21, true);

setval 3 টি পরামিতি রয়েছে:

  • 1 ম প্যারামিটার হয় sequence_name
  • ২ য় প্যারামিটার হ'ল নেক্সট nextval
  • 3 য় প্যারামিটার isচ্ছিক।

সেটওয়ালের তৃতীয় প্যারামিটারে সত্য বা মিথ্যা ব্যবহার নিম্নরূপ:

SELECT setval('payments_id_seq', 21);           // Next nextval will return 22
SELECT setval('payments_id_seq', 21, true);     // Same as above 
SELECT setval('payments_id_seq', 21, false);    // Next nextval will return 21

সিক্যুয়েন্স নামটির হার্ড-কোডিং এড়ানোর আরও ভাল উপায়, পরবর্তী সিকোয়েন্স মান এবং খালি কলামের টেবিলটি সঠিকভাবে পরিচালনা করতে আপনি নীচের উপায়ে ব্যবহার করতে পারেন:

SELECT setval(pg_get_serial_sequence('table_name', 'id'), coalesce(max(id), 0)+1 , false) FROM table_name;

যেখানে table_nameটেবিলের নাম, idহয় primary keyটেবিলের


ধন্যবাদ! শেষ প্রকাশটি হ'ল আমি যা খুঁজছিলাম। এটি আমাকে পরে ব্যাচের মাধ্যমে সন্নিবেশ করার জন্য ক্রম মানগুলি সংরক্ষণ করতে সহায়তা করে।
তৈমুর


0

আমি এর মাধ্যমে ক্রম পরিবর্তন করার চেষ্টা করি না setval। তবে ব্যবহার করে ALTERআমাকে জারি করা হয়েছিল কিভাবে সিক্যুয়েন্স নামটি সঠিকভাবে লিখবেন। এবং এটি কেবল আমার জন্য কাজ:

  1. প্রয়োজনীয় ক্রম নাম ব্যবহার করে পরীক্ষা করুন SELECT * FROM information_schema.sequences;

  2. ALTER SEQUENCE public."table_name_Id_seq" restart {number};

    আমার ক্ষেত্রে ছিল ALTER SEQUENCE public."Services_Id_seq" restart 8;

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