আমি মাইএসকিউএল থেকে পোস্টগ্রেএসকিউএল এ স্যুইচ করছি এবং ভাবছিলাম যে কীভাবে আমি স্বতঃআগ্রহ মান করতে পারি। আমি পোস্টগ্রাইএসকিউএল ডক্সে একটি ডেটাটাইপ "সিরিয়াল" দেখেছি, তবে এটি ব্যবহার করার সময় আমি সিনট্যাক্স ত্রুটি পেয়েছি (v8.0 এ)।
আমি মাইএসকিউএল থেকে পোস্টগ্রেএসকিউএল এ স্যুইচ করছি এবং ভাবছিলাম যে কীভাবে আমি স্বতঃআগ্রহ মান করতে পারি। আমি পোস্টগ্রাইএসকিউএল ডক্সে একটি ডেটাটাইপ "সিরিয়াল" দেখেছি, তবে এটি ব্যবহার করার সময় আমি সিনট্যাক্স ত্রুটি পেয়েছি (v8.0 এ)।
উত্তর:
হ্যাঁ, সিরিয়াল সমতুল্য ফাংশন।
CREATE TABLE foo (
id SERIAL,
bar varchar);
INSERT INTO foo (bar) values ('blah');
INSERT INTO foo (bar) values ('blah');
SELECT * FROM foo;
1,blah
2,blah
সিরিয়ালটি সিকোয়েন্সগুলির চারপাশে কেবল তৈরি টেবিল টাইম ম্যাক্রো। আপনি বিদ্যমান কলামে সিরিয়াল পরিবর্তন করতে পারবেন না।
"Table"
এবং "table"
তারপরে এটিকে কেবল অকেজো রেখে দিন এবং এটিতে ক্যানোনিকালাইজ করা যায় না table
। সম্মেলনে পিজিতে কখনই উদ্ধৃতি ব্যবহার করা যায় না। আপনি, যদি আপনি চান তবে উপস্থিতির জন্য মিশ্র মামলার নামগুলি ব্যবহার করতে পারেন, কেবল এটির দরকার নেই: CREATE TABLE fooBar ( .. ); SELECT * FROM fooBar;
কাজ করবে, ইচ্ছামতো করবে SELECT * FROM foobar
।
আপনি যেমন কোনও অন্যান্য পূর্ণসংখ্যার ডেটা টাইপ ব্যবহার করতে পারেন smallint
।
উদাহরণ:
CREATE SEQUENCE user_id_seq;
CREATE TABLE user (
user_id smallint NOT NULL DEFAULT nextval('user_id_seq')
);
ALTER SEQUENCE user_id_seq OWNED BY user.user_id;
ব্যবহারকারীর ক্রমিক ডেটা টাইপের পরিবর্তে আপনার নিজের ডেটা টাইপ ব্যবহার করা আরও ভাল ।
CREATE SEQUENCE
postgresql.org/docs/8.1/interactive/sql-createsequence.html পড়ার পরে ) । তবুও, কেন আপনি মালিককে পরিবর্তন করেছেন তা আমি নিশ্চিত নই।
আপনি যদি ইতিমধ্যে বিদ্যমান সারণীতে আইডিতে ক্রম যুক্ত করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:
CREATE SEQUENCE user_id_seq;
ALTER TABLE user ALTER user_id SET DEFAULT NEXTVAL('user_id_seq');
ALTER COLUMN user_id
?
ERROR: syntax error at or near "DEFAULT"
কোনও পরামর্শ?
দেখে মনে হচ্ছে ক্রমগুলি মাইএসকিউএল অটো_সামগ্রীর সমতুল্য , কিছু সূক্ষ্ম তবে গুরুত্বপূর্ণ পার্থক্য রয়েছে:
সিরিয়াল কলাম ব্যর্থ প্রশ্নের উপর বর্ধিত হয়। এটি কেবল সারি মুছে ফেলা নয়, ব্যর্থ প্রশ্নগুলি থেকে বিভাজন ঘটায়। উদাহরণস্বরূপ, আপনার পোস্টগ্রিজ এসকিউএল ডাটাবেসে নিম্নলিখিত প্রশ্নগুলি চালান:
CREATE TABLE table1 (
uid serial NOT NULL PRIMARY KEY,
col_b integer NOT NULL,
CHECK (col_b>=0)
);
INSERT INTO table1 (col_b) VALUES(1);
INSERT INTO table1 (col_b) VALUES(-1);
INSERT INTO table1 (col_b) VALUES(2);
SELECT * FROM table1;
আপনি নিম্নলিখিত আউটপুট পেতে হবে:
uid | col_b
-----+-------
1 | 1
3 | 2
(2 rows)
ইউডি কীভাবে 1 থেকে 2 এর পরিবর্তে 1 থেকে 3 এ যায় তা লক্ষ্য করুন।
এটি ম্যানুয়ালি আপনার নিজের ক্রমটি নিজের সাথে তৈরি করতে পারলে এটি এখনও ঘটে:
CREATE SEQUENCE table1_seq;
CREATE TABLE table1 (
col_a smallint NOT NULL DEFAULT nextval('table1_seq'),
col_b integer NOT NULL,
CHECK (col_b>=0)
);
ALTER SEQUENCE table1_seq OWNED BY table1.col_a;
আপনি যদি মাইএসকিউএল আলাদা কী তা পরীক্ষা করতে চান তবে মাইএসকিউএল ডাটাবেসে নিম্নলিখিতটি চালান:
CREATE TABLE table1 (
uid int unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
col_b int unsigned NOT NULL
);
INSERT INTO table1 (col_b) VALUES(1);
INSERT INTO table1 (col_b) VALUES(-1);
INSERT INTO table1 (col_b) VALUES(2);
বিনা বাক্সে ছাড়াই আপনার নিম্নলিখিতটি পাওয়া উচিত :
+-----+-------+
| uid | col_b |
+-----+-------+
| 1 | 1 |
| 2 | 2 |
+-----+-------+
2 rows in set (0.00 sec)
এটি পূর্ববর্তী উত্তরে @ ট্রেভ দ্বারা চিহ্নিত করা হয়েছিল।
এটিকে ম্যানুয়ালি অনুকরণ করতে uid 4 এ সেট করুন যা পরে "সংঘর্ষ" হবে।
INSERT INTO table1 (uid, col_b) VALUES(5, 5);
সারণী ডেটা:
uid | col_b
-----+-------
1 | 1
3 | 2
5 | 5
(3 rows)
অন্য একটি সন্নিবেশ চালান:
INSERT INTO table1 (col_b) VALUES(6);
সারণী ডেটা:
uid | col_b
-----+-------
1 | 1
3 | 2
5 | 5
4 | 6
এখন আপনি যদি অন্য একটি সন্নিবেশ চালান:
INSERT INTO table1 (col_b) VALUES(7);
এটি নিম্নলিখিত ত্রুটি বার্তার সাথে ব্যর্থ হবে:
ত্রুটি: সদৃশ কী মানটি অনন্য বাধা "টেবিল 1_পকি" বিবরণ লঙ্ঘন করে: কী (uid) = (5) ইতিমধ্যে বিদ্যমান।
বিপরীতে, মাইএসকিউএল নিচে দেখানো হিসাবে এটি করুণভাবে পরিচালনা করবে:
INSERT INTO table1 (uid, col_b) VALUES(4, 4);
এখন uid সেট না করেই আর একটি সারি .োকান
INSERT INTO table1 (col_b) VALUES(3);
ক্যোয়ারীটি ব্যর্থ হয় না, আপনি কেবল 5 এ লাফিয়ে যান:
+-----+-------+
| uid | col_b |
+-----+-------+
| 1 | 1 |
| 2 | 2 |
| 4 | 4 |
| 5 | 3 |
+-----+-------+
লিনাক্স (x86_64) এবং পোস্টগ্রিসকিউএল 9.4.9 এর জন্য মাইএসকিউএল 5.6.33 এ পরীক্ষা করা হয়েছিল
পোস্টগ্রিস 10 দিয়ে শুরু করে, এসকিউএল স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত পরিচয় কলামগুলিও সমর্থিত:
create table foo
(
id integer generated always as identity
);
একটি পরিচয় কলাম তৈরি করে যা স্পষ্টভাবে জিজ্ঞাসা না করা হলে ওভাররাইড করা যায় না। নীচের সন্নিবেশ হিসাবে সংজ্ঞায়িত কলাম সহ ব্যর্থ হবেgenerated always
:
insert into foo (id)
values (1);
এটি তবে বাতিল করা যেতে পারে:
insert into foo (id) overriding system value
values (1);
বিকল্পটি ব্যবহার করার সময় generated by default
এটি মূলত বিদ্যমান হিসাবে একই আচরণ behaviorserial
বাস্তবায়নের :
create table foo
(
id integer generated by default as identity
);
যখন মানটি ম্যানুয়ালি সরবরাহ করা হয়, অন্তর্নিহিত ক্রমটি নিজেও পাশাপাশি সামঞ্জস্য করা দরকার - একটির সাথে একই serial
কলামের ।
একটি পরিচয় কলাম ডিফল্টরূপে প্রাথমিক কী নয় (ঠিক serial
কলামের মতো )। যদি এটি এক হওয়া উচিত তবে একটি প্রাথমিক কী বাধাটি ম্যানুয়ালি সংজ্ঞায়িত করা দরকার।
দুঃখিত, একটি পুরানো প্রশ্ন পুনঃভাগ করতে, তবে এটিই প্রথম স্ট্যাক ওভারফ্লো প্রশ্ন / উত্তর যা গুগলে আপ আপ হয়েছে।
এই পোস্টটি (যা গুগলে প্রথমে উঠে এসেছে) পোস্টগ্রিসএসকিউএল 10: https://blog.2ndquadrant.com/postgresql-10- ঘটনাস্থল-কলামগুলি /
যা হ'ল:
CREATE TABLE test_new (
id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
);
আশা করি এইটি কাজ করবে :)
GENERATED … AS IDENTITY
কমান্ডগুলি স্ট্যান্ডার্ড এসকিউএল। প্রথমে এসকিউএল: 2003 এ যুক্ত হয়েছে , তারপরে এসকিউএল: ২০০৮- তে স্পষ্ট করা হয়েছে । বৈশিষ্ট্যগুলি দেখুন # T174 এবং F386 এবং T178।
আপনার সিরিয়াল বা সিকোয়েন্স ফিল্ডে সরাসরি notোকানোর জন্য আপনাকে সতর্কতা অবলম্বন করতে হবে, অন্যথায় আপনার ক্রমটি সন্নিবেশকৃত মানটিতে পৌঁছে গেলে ব্যর্থ হবে:
-- Table: "test"
-- DROP TABLE test;
CREATE TABLE test
(
"ID" SERIAL,
"Rank" integer NOT NULL,
"GermanHeadword" "text" [] NOT NULL,
"PartOfSpeech" "text" NOT NULL,
"ExampleSentence" "text" NOT NULL,
"EnglishGloss" "text"[] NOT NULL,
CONSTRAINT "PKey" PRIMARY KEY ("ID", "Rank")
)
WITH (
OIDS=FALSE
);
-- ALTER TABLE test OWNER TO postgres;
INSERT INTO test("Rank", "GermanHeadword", "PartOfSpeech", "ExampleSentence", "EnglishGloss")
VALUES (1, '{"der", "die", "das", "den", "dem", "des"}', 'art', 'Der Mann küsst die Frau und das Kind schaut zu', '{"the", "of the" }');
INSERT INTO test("ID", "Rank", "GermanHeadword", "PartOfSpeech", "ExampleSentence", "EnglishGloss")
VALUES (2, 1, '{"der", "die", "das"}', 'pron', 'Das ist mein Fahrrad', '{"that", "those"}');
INSERT INTO test("Rank", "GermanHeadword", "PartOfSpeech", "ExampleSentence", "EnglishGloss")
VALUES (1, '{"der", "die", "das"}', 'pron', 'Die Frau, die nebenen wohnt, heißt Renate', '{"that", "who"}');
SELECT * from test;
জিজ্ঞাসিত প্রশ্নের প্রসঙ্গে এবং @ sereja1c এর মন্তব্যের জবাবে, স্পষ্টতই SERIAL
তৈরি করা ক্রমগুলি তৈরি করে, সুতরাং উপরের উদাহরণটির জন্য-
CREATE TABLE foo (id SERIAL,bar varchar);
CREATE TABLE
সুস্পষ্টভাবে foo_id_seq
সিরিয়াল কলামের জন্য ক্রম তৈরি করবে foo.id
। সুতরাং, SERIAL
আপনার আইডির জন্য নির্দিষ্ট ডেটাটাইপের প্রয়োজন না হলে [4 বাইটস] এর সহজেই ব্যবহারের পক্ষে ভাল।
এই উপায়টি নিশ্চিতভাবে কাজ করবে, আমি আশা করি এটি সাহায্য করে:
CREATE TABLE fruits(
id SERIAL PRIMARY KEY,
name VARCHAR NOT NULL
);
INSERT INTO fruits(id,name) VALUES(DEFAULT,'apple');
or
INSERT INTO fruits VALUES(DEFAULT,'apple');
আপনি পরবর্তী লিঙ্কে এই বিশদটি পরীক্ষা করতে পারেন: http://www.postgresqltutorial.com/postgresql-serial/
পোস্টগ্র্রেএসকিউএল 10 থেকে
CREATE TABLE test_new (
id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
payload text
);