এড়াতে টেবিলের কাঠামো ঠিক করা `ত্রুটি: সদৃশ কী মানটি অনন্য সীমাবদ্ধতা লঙ্ঘন করে`


15

আমার কাছে একটি টেবিল রয়েছে যা এইভাবে তৈরি করা হয়েছে:

--
-- Table: #__content
--
CREATE TABLE "jos_content" (
  "id" serial NOT NULL,
  "asset_id" bigint DEFAULT 0 NOT NULL,
   ...
  "xreference" varchar(50) DEFAULT '' NOT NULL,
  PRIMARY KEY ("id")
);

পরে আইডি নির্দিষ্ট করে কিছু সারি প্রবেশ করানো হয়:

INSERT INTO "jos_content" VALUES (1,36,'About',...)

পরবর্তী সময়ে কিছু রেকর্ড আইডি ছাড়াই প্রবেশ করানো হয় এবং তারা ত্রুটি সহ ব্যর্থ: Error: duplicate key value violates unique constraint

দৃশ্যত আইডিটি একটি অনুক্রম হিসাবে সংজ্ঞায়িত হয়েছে:

এখানে চিত্র বর্ণনা লিখুন

প্রতিটি ব্যর্থ সন্নিবেশ ক্রমানুসারে পয়েন্টার বাড়িয়ে দেয় যতক্ষণ না এটি এমন কোনও মানের সাথে বৃদ্ধি হয় যেগুলি আর বিদ্যমান না এবং অনুসন্ধানগুলি সফল হয়।

SELECT nextval('jos_content_id_seq'::regclass)

টেবিল সংজ্ঞা দিয়ে কি ভুল? এটি ঠিক করার স্মার্ট উপায় কী?


PostgreSQL এ, কলাম এবং টেবিলের নামগুলি যদি তারা সমস্ত ছোট হাতের হয় তবে আপনার উদ্ধৃতি দেওয়ার দরকার নেই to
রডরিগো

উত্তর:


19

আপনার টেবিল সংজ্ঞা সাথে কিছুই ভুল হয় না।
(টুপি আমি ব্যবহার করেন ছাড়া jos_content_idবা অ- বর্ণনামূলক কলাম নামের পরিবর্তে কিছু id
আর আমি সম্ভবত হবে ব্যবহার textপরিবর্তেvarchar(50)

আপনার INSERTবক্তব্য সমস্যা।

আপনার idকলামটি হিসাবে সংজ্ঞায়িত হয়েছে serial, আপনার পক্ষে ম্যানুয়াল মান সন্নিবেশ করা উচিত নয় id। এগুলি সম্পর্কিত ক্রম থেকে পরবর্তী মানের সাথে সংঘর্ষে থাকতে পারে।

লক্ষ্য কলামগুলির একটি সুস্পষ্ট তালিকা সরবরাহ করুন (যা প্রায়শই অব্যাহত INSERTবিবৃতিগুলির জন্য ভাল ধারণা ) এবং সিরিয়াল কলামগুলি সম্পূর্ণ বাদ দেয় it

INSERT INTO jos_content(asset_id, some_column, ...)
VALUES (36,'About',...);

আপনার যদি অবিলম্বে স্বয়ংক্রিয়ভাবে উত্পন্ন কলামের গুলিগুলির মান (গুলি) দরকার হয় তবে এই RETURNINGধারাটি ব্যবহার করুন :

INSERT ...
RETURNING id;  -- possibly more

এসও সম্পর্কিত এই সম্পর্কিত উত্তরের আরও বিশদ:

আপনার যদি serialকলামগুলিতে ম্যানুয়াল এন্ট্রি থাকে যা পরে দ্বন্দ্ব করতে পারে তবে এটি একবারে ঠিকid করার জন্য আপনার সিকোয়েন্সটি বর্তমান সর্বাধিকের সাথে সেট করুন :

SELECT setval('jos_content_id_seq', max(id))
FROM   jos_content;

jos_content_id_seqমালিকানাধীন সিকোয়েন্সের ডিফল্ট নাম কোথায় jos_content.id, আপনি ইতিমধ্যে কলাম ডিফল্টে খুঁজে পেয়েছেন। xhzt8_content_id_seqআপনার ক্ষেত্রে মনে হয় ;


আপডেট: একটি অনুরূপ ইস্যু এসও-তে পপ আপ হয়েছিল এবং আমি একটি নতুন সমাধান নিয়ে এসেছি:


পাঠ্যটি ভারচরের চেয়ে ধীর নয় (50)?
রডরিগো

2
@ রডরিগো: পোস্টগ্রিসে নেই। আরও ব্যাখ্যার জন্য উপরে একটি লিঙ্ক রয়েছে: dba.stackexchange.com/a/21496/3684 । বা এখানে। dba.stackexchange.com/a/89433/3684
এরউইন ব্র্যান্ডস্টেটার

এখানে সর্বশেষ পরীক্ষাটি < Depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text > আমাকে নিশ্চিত করেছে যে বেশিরভাগ ক্ষেত্রে ক্ষেত্রের জন্য ভারচর (এন) দ্রুততর যেখানে আকারের সীমাবদ্ধতা সুবিধাজনক (লোকেরা) নাম, ইমেল, ঠিকানা, প্রজাতির নাম, ইত্যাদি)। পাঠ্যটি দ্রুত (বা একই) আপনি যদি দৈর্ঘ্যটি পরীক্ষা না করেন তবে মনে হয়।
রডরিগো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.