ক্যাটালগের ভিত্তিতে কোনও পূর্ণসংখ্যার পরিবর্তে কোনও কলাম একটি সিরিয়াল ডেটা টাইপ হিসাবে সংজ্ঞায়িত করা হয় তা আমি কীভাবে নির্ধারণ করব?


9

সুতরাং আমি বর্তমানে টেবিল সংজ্ঞা তৈরি করতে পোস্টগ্রিস (9.1) ক্যাটালগের মাধ্যমে পড়তে কিছু এসকিউএল তৈরি করছি। যাইহোক, আমি সিরিয়াল / বিগ্রহের ডেটা ধরণের ক্ষেত্রে একটি সমস্যার মুখোমুখি হয়েছি।

উদাহরণ:

CREATE TABLE cruft.temp ( id BIGSERIAL PRIMARY KEY );
SELECT * FROM information_schema.columns WHERE table_schema='cruft' AND table_name='temp';
"db","cruft","temp","id",1,"nextval('cruft.temp_id_seq'::regclass)","NO","bigint",,,64,2,0,,,,,,,,,,,,,"db","pg_catalog","int8",,,,,"1","NO","NO",,,,,,,"NEVER",,"YES"

এটি আমাকে ডাটাবেসের নাম (ডিবি), স্কিমা নাম (ক্রুফ্ট), সারণীর নাম (অস্থায়ী), কলামের নাম (আইডি), ডিফল্ট মান (পরের (...)), এবং ডেটা টাইপ (বিগিন্ট এবং ইনট 8 .. বিগ্রেসিয়াল নয়) দেয় ... আমি বুঝতে পেরেছি যে ডিফল্ট মানটি একটি ক্রম ছিল কিনা তা আমি খতিয়ে দেখতে পেরেছি - তবে আমি বিশ্বাস করি না যে এটি 100% সঠিক হবে কারণ আমি নিজে নিজেই একটি সিকোয়েন্স তৈরি করতে এবং সিরিয়াল কলাম তৈরি করতে পারি যেখানে ডিফল্ট মান ছিল যে ক্রম।

আমি কীভাবে এটি সম্পাদন করতে পারি তার জন্য কারও কি কোনও পরামর্শ রয়েছে? পরবর্তী পরবর্তী (* _ সেক) জন্য ডিফল্ট মান পরীক্ষা করা ছাড়া অন্য কিছু?

টিএল; ডিআর বা pg_catolog সাথে অপরিচিত নতুন ব্যবহারকারীদের ক্ষেত্রে এসকিউএল সমাধানের জন্য সম্পাদিত এখানে:

with sequences as (
  select oid, relname as sequencename from pg_class where relkind = 'S'
) select
  sch.nspname as schemaname, tab.relname as tablename, col.attname as columnname, col.attnum as columnnumber, seqs.sequencename
from pg_attribute col
join pg_class tab on col.attrelid = tab.oid
join pg_namespace sch on tab.relnamespace = sch.oid
left join pg_attrdef def on tab.oid = def.adrelid and col.attnum = def.adnum
left join pg_depend deps on def.oid = deps.objid and deps.deptype = 'n'
left join sequences seqs on deps.refobjid = seqs.oid
where sch.nspname != 'information_schema' and sch.nspname not like 'pg_%' -- won't work if you have user schemas matching pg_
  and col.attnum > 0
  and seqs.sequencename is not null -- TO ONLY VIEW SERIAL/BIGSERIAL COLUMNS
order by sch.nspname, tab.relname, col.attnum;

1
পরে কোড সম্পর্কিত উদাহরণগুলির সাথে সম্পর্কিত উত্তর: dba.stackexchange.com/questions/90555/…
এরউইন ব্র্যান্ডসটেটার

উত্তর:


8

সিরিয়াল এবং বিগ্রিয়ারিয়াল হ'ল সিউডো-প্রকারের। যেমন আপনি লক্ষ্য করেছেন, এগুলি অভ্যন্তরীণভাবে কেবলমাত্র INT এবং BIGINT

পর্দার আড়ালে কী ঘটে তা হ'ল পোস্টগ্রেএসকিউএল একটি সিকোয়েন্স তৈরি করে এবং তার উপর টেবিলের উপর নির্ভরতা সেট করে। সিকোয়েন্স নাম এবং এটি টেবিলের সাথে কীভাবে সম্পর্কিত তার জন্য আপনি পিজি_ক্লাস অনুসন্ধান করতে পারেন ।

pg_class: http://www.postgresql.org/docs/9.2/static/catolog-pg-class.html

এসকিউএল ফিডল: http://sqlfiddle.com/#!12/dfcbd/6

সিকোয়েন্স ফাংশন: http://www.postgresql.org/docs/9.2/static/function-sequence.html

এই স্ট্যাকওভারফ্লো পোস্টটি সহায়ক হতে পারে: /programming/1493262/list-all-sequences-in-a-postgres-db-8-1-with-sql

আপডেট : আপনি আগ্রহী টেবিল / কলামের সাথে কোন সিকোয়েন্সগুলি সম্পর্কিত তা নির্ধারণ করতে আপনি পিজি_ডিপেন্ড ব্যবহার করতে পারেন : http://www.postgresql.org/docs/9.2/static/catolog-pg-d depend.html


10

আমি ইফেসারের উত্তরে যুক্ত করতে পারি যে ডকুমেন্টেশনে নিম্নলিখিতটি উল্লেখ করা হয়েছে:

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

CREATE TABLE tablename (
    colname SERIAL
);

উল্লেখ করার সমতুল্য:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;

যার অর্থ যদি

  • একটি কলামের ডেটা টাইপ হল পূর্ণসংখ্যা (বিগিন্ট) এবং
  • এটি নাল নয় এবং
  • এর ডিফল্ট মানটি প্রশ্নযুক্ত কলামের মালিকানাধীন ক্রম থেকে আসে

তাহলে এটি একটি serialকলাম। সুতরাং ক্যাটালগগুলিতে এই উপাদানগুলি পরীক্ষা করা, যেমন আপনি প্রস্তাব করেছিলেন (যোগ করার সাথে সাথে NOT NULL), একটি serialকলাম সনাক্ত করতে যথেষ্ট ।

(বড়) সিরিয়ালগুলি সন্ধান করার জন্য একটি আসল প্রশ্নের জন্য , এরউইন ব্র্যান্ডস্টেটারের দুর্দান্ত উত্তরটি দেখুন ।

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