এররের কারণ কী: রেফারেন্সড টেবিলের জন্য প্রদত্ত কীগুলির সাথে কোনও অনন্য বাধা মিলছে না?


154

উদাহরণস্বরূপ, সারণির কাঠামোর নীচে একটি ত্রুটি দেওয়া হয়েছে: রেফারেন্সযুক্ত টেবিলের জন্য প্রদত্ত কীগুলির সাথে কোনও অনন্য বাধা নেই, এবং এটির জন্য তাকিয়ে থাকার পরে আমি বুঝতে পারি না কেন এই পরিস্থিতিতে এই ত্রুটি দেখা দেয়।

BEGIN;

CREATE TABLE foo (
    name                VARCHAR(256) PRIMARY KEY
);

CREATE TABLE bar(
    pkey        SERIAL PRIMARY KEY,
    foo_fk      VARCHAR(256) NOT NULL REFERENCES foo(name), 
    name        VARCHAR(256) NOT NULL, 
    UNIQUE (foo_fk,name)
);

CREATE TABLE baz(   
    pkey            SERIAL PRIMARY KEY,
    bar_fk          VARCHAR(256) NOT NULL REFERENCES bar(name),
    name            VARCHAR(256)
);

COMMIT;

উপরের কোডটি চালনা করা নিম্নলিখিত ত্রুটিটি দেয় যা আমার কাছে বোধগম্য নয়, যে কেউ এই ত্রুটি কেন ঘটেছে তা ব্যাখ্যা করতে পারে। আমি পোস্টগ্রিজ 9.1 ব্যবহার করছি

NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "foo_pkey" for table "foo"
NOTICE:  CREATE TABLE will create implicit sequence "bar_pkey_seq" for serial column "bar.pkey"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "bar_pkey" for table "bar"
NOTICE:  CREATE TABLE / UNIQUE will create implicit index "bar_foo_fk_name_key" for table "bar"
NOTICE:  CREATE TABLE will create implicit sequence "baz_pkey_seq" for serial column "baz.pkey"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "baz_pkey" for table "baz"
ERROR:  there is no unique constraint matching given keys for referenced table "bar"


********** Error **********

ERROR: there is no unique constraint matching given keys for referenced table "bar"
SQL state: 42830

উত্তর:


188

এটি কারণ টেবিলের nameকলামে অনন্য বাধা নেই।bar

সুতরাং মনে করুন আপনার 2 সারি আছে barসারণি নাম থাকতে 'ams'এবং আপনার একটি সারি সন্নিবেশ bazসঙ্গে 'ams'উপর bar_fk, উপর যা সারি barএরপর থেকে এটি দুটি মিলে সারি হয় উল্লেখ করা হবে?


1
নিখুঁত সংক্ষিপ্ত এবং নির্ভুল এবং ব্যাখ্যা ধরা সহজ!
অ্যালেক্স

79

পোস্টগ্র্যাস্কল-এ সমস্ত বিদেশী কী অবশ্যই পিতামাতার টেবিলে একটি অনন্য কী উল্লেখ করতে পারে, সুতরাং আপনার barটেবিলটিতে আপনার একটি unique (name)সূচক থাকতে হবে।

Http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK এও দেখুন এবং বিশেষত:

শেষ অবধি, আমাদের উল্লেখ করা উচিত যে একটি বিদেশী কী অবশ্যই এমন কলামগুলি উল্লেখ করতে পারে যা হয় প্রাথমিক কী বা একটি অনন্য বাধা তৈরি করে।

জোর আমার।


21
ঘোষিত পিকে কেন অনন্য প্রতিবন্ধক হিসাবে বিবেচনা করা হয় না? এটি আপনার
পছন্দসই

2
এটি অবশ্যই "এটিকে নির্দেশ করে" টেবিলে অনন্য হতে হবে, কারণ এটি যদি না হয় তবে ডাটাবেস ইঞ্জিনটি আপনি কোন সারিতে আসলে উল্লেখ করছেন তা জানার কোনও উপায় থাকবে না।
মাত্তেও তাসিনারি

যৌগিক কী? @ এমপিবিভিয়েন্ট
কমনীয় রোবট

1
আমি মনে করি পিতামাতার টেবিলে রেফারেন্সযুক্ত কলামে একটি অনন্য কী থাকা কেবল
পোস্টগ্রেস্কলগুলিতেই

2
নোট করুন উত্তরটি সম্মিলিত বিদেশী কীগুলির জন্যও সত্য, যেখানে পিতামাতার টেবিলে একটি যৌগিক অনন্য বাধা বা প্রাথমিক কী প্রয়োজন।
নিনজাকাননুন

8

আপনি যখন UNIQUEযেমন টেবিল স্তরের সীমাবদ্ধতা হিসাবে কাজ করেন তখন আপনার সংজ্ঞাটি কি কিছুটা যৌগিক প্রাথমিক কী-এর মতো হয় ডিডিএল সীমাবদ্ধতা দেখুন , এখানে একটি এক্সট্রাক্ট

"This specifies that the *combination* of values in the indicated columns is unique across the whole table, though any one of the columns need not be (and ordinarily isn't) unique."

এর অর্থ এই যে পারেন ক্ষেত্র সম্ভবত একটি অ অনন্য মান থাকতে পারে প্রদত্ত সমন্বয় অনন্য এবং এই আপনার ফরেইন কী বাধ্যতা সাথে মিলছে না।

সম্ভবত আপনি সীমাবদ্ধতা কলাম স্তরে থাকতে চান। সুতরাং তারপরে তাদেরকে টেবিল স্তরের সীমাবদ্ধতা হিসাবে সংজ্ঞায়িত করুন, UNIQUEকলাম সংজ্ঞাটির শেষে 'যুক্ত করুন' name VARCHAR(60) NOT NULL UNIQUEবা প্রতিটি ক্ষেত্রের জন্য স্বতন্ত্র টেবিল স্তরের সীমাবদ্ধতা নির্দিষ্ট করুন।


আমার পরিস্থিতিতে কলাম স্তরের সীমাবদ্ধতা কাজ করবে না আমি সত্যিই একটি যৌগিক প্রাথমিক কীটি সংজ্ঞায়িত করা উচিত, তবে আমি এটি থেকে পিছনে সরে এসেছি কারণ এটি
জেপিএতে

6

আপনার অনন্য বাধা হিসাবে নাম কলাম থাকা উচিত। আপনার সমস্যাগুলি পরিবর্তন করতে এখানে একটি 3 লাইন কোড lines

  1. প্রথমে এই কোডটি টাইপ করে প্রাথমিক কী বাধাগুলি সন্ধান করুন

    \d table_name

    আপনি নীচে এইভাবে প্রদর্শিত হয় "some_constraint" PRIMARY KEY, btree (column)

  2. সীমাবদ্ধতা ফেলে দিন:

    ALTER TABLE table_name DROP CONSTRAINT some_constraint
  3. বিদ্যমান একটি সহ একটি নতুন প্রাথমিক কী কলাম যুক্ত করুন:

    ALTER TABLE table_name ADD CONSTRAINT some_constraint PRIMARY KEY(COLUMN_NAME1,COLUMN_NAME2);

এখানেই শেষ.

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