অলটার টেবিলে বিবৃতি বিদেশী মূল সীমাবদ্ধতার সাথে বিরোধী


184

আমার tblDomareটেবিলে একটি বিদেশী কী যুক্ত করার চেষ্টা করার সময় আমার একটি সমস্যা আছে ; আমি এখানে কি ভুল করছি?

CREATE TABLE tblDomare
(PersNR VARCHAR (15) NOT NULL,
fNamn VARCHAR (15) NOT NULL,
eNamn VARCHAR (20) NOT NULL,
Erfarenhet VARCHAR (5),
PRIMARY KEY (PersNR));

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,'Bengt','Carlberg',10);

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (7606091347,'Josefin','Backman',4);

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (8508284163,'Johanna','Backman',1);

CREATE TABLE tblBana
(BanNR VARCHAR (15) NOT NULL,
PRIMARY KEY (BanNR));

INSERT INTO tblBana (BanNR)
Values (1);

INSERT INTO tblBana (BanNR)
Values (2);

INSERT INTO tblBana (BanNR)
Values (3);

ALTER TABLE tblDomare
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);

ভুল বার্তা:

ALTER TABLE বিবৃতিটি বিদেশী কী বাধা "FK_ tblDomare__PersN__5F7E2DAC " এর সাথে সাংঘর্ষিক । "Almu0004" ডাটাবেস, টেবিল "dbo.tblBana", কলাম 'BanNR' এ বিরোধ দেখা দিয়েছে।

উত্তর:


333

এটা তোলে ঘটেছে কারণ আপনার কাছ থেকে একটি বিদেশী কী তৈরি করার চেষ্টা করেছেন tblDomare.PersNRকরতে tblBana.BanNRকিন্তু / এবং মান tblDomare.PersNRমান সাথে মেলে নি tblBana.BanNR। আপনি এমন কোনও সম্পর্ক তৈরি করতে পারবেন না যা রেফারেন্সিয়াল অখণ্ডতা লঙ্ঘন করে।


87
এটি আমার জন্য উত্তর ছিল, তবে সমস্যাটি কোথায় তা বুঝতে পেরে আমি এখনও লড়াই করেছিলাম, তাই আমি একজন সাধারণ ব্যক্তির উদাহরণ দেব। আপনার যদি 'অর্ডারস' নামে একটি টেবিল এবং 'গ্রাহক' নামে একটি টেবিল থাকে এবং আপনি কিছু পুরানো গ্রাহক মুছে ফেলেছেন তবে তাদের আদেশগুলি নয়, আপনি যদি অর্ডারগুলি থেকে কোনও বিদেশী কী তৈরি করার সিদ্ধান্ত নেন তবে আপনি এই ত্রুটিটি পাবেন ust গ্রাহকগণের সাথে সংযুক্ত .Id। কিছু আদেশের সাথে সম্পর্কিত গ্রাহক আর নেই, সুতরাং বিদেশী কী যুক্ত করা অসম্ভব।
চাদ হেডককক

10
ভুল মানগুলি যাচাই করার জন্য এখানে একটি জিজ্ঞাসা রয়েছে: রেফারার থেকে আলাদা রেফারার নির্বাচন করুন able
jumxozizi

6
একটি চিম্টিতে, আপনি এফকে যুক্ত করার জন্য "অলটার টেবিলে টেবিলনাম উইথ এনওচেক ..." বিকল্পটিও ব্যবহার করতে পারেন। বিদ্যমান ডেটা সীমাবদ্ধতা ভঙ্গ করলেও এটি আপনাকে সম্পর্ক যুক্ত করতে দেয়। প্রথমে আপনার ডেটা পরিষ্কার করা আরও ভাল, তবে এটি অন্তত আপনাকে অন্য একটি বিকল্প দেয়।
ডেভইনমেন

2
@ ডেভআইমন
স্মুতজে

1
কি লম্পট ত্রুটি বার্তা। আগে এটি দেখেছিল কিন্তু আমাকে পুরোপুরি পাহারায় ফেলেছে ঠিক এখন
ভেবেছে যে কোনও

42

এই প্রশ্নটি আমার জন্য খুব দরকারী ছিল। এটি এমন সমস্ত মান দেখায় যার কোনও মিল নেই

select FK_column from FK_table
WHERE FK_column NOT IN
(SELECT PK_column from PK_table)

37

এই সমাধান চেষ্টা করুন:

আপনার টেবিলে এমন একটি ডেটা আইটেম রয়েছে যার সম্পর্কিত মানটি সারণীতে বিদ্যমান নেই যা আপনি এটিকে প্রাথমিক কী টেবিল হিসাবে ব্যবহার করতে চান। আপনার টেবিলটি খালি করুন বা দ্বিতীয় সারণীতে যুক্ত মান যুক্ত করুন।


29

অলটার টেবিলে নাম্বারবিহীন ব্যবহার করে বিদেশী কী তৈরি করা সম্ভব ..., যা বিদেশী কী লঙ্ঘন করে এমন ডেটা মঞ্জুরি দেয়।

এফকে যোগ করার জন্য "অল্টার টেবিলের নাম টেবিলের নাম ..." বিকল্পটি - এই সমাধানটি আমার পক্ষে কাজ করেছে।


17
সচেতন থাকুন যে এই জাতীয় লঙ্ঘনকে অনুমতি দেওয়া বিদেশী মূল সীমাবদ্ধতার উদ্দেশ্যকে পরাস্ত করে।
সংস্কার করা হয়েছে

বিপজ্জনক ... !!! আপনি যদি বর্তমানে সারণীতে থাকা ডেটা আলগা করতে না চান তবেই ব্যবহার করা উচিত। তবে তারপরেও কেন ব্যাকআপ করবেন না এবং তারপরে অবৈধ আইডিগুলি সরিয়ে ফেলুন।
আন্দ্রে বাজানভ

এটি করার জন্য আমার জাভা / স্প্রিং / কোডের মাধ্যমে বাস্তবায়ন করতে হবে, সরাসরি এসকিউএল ক্যোয়ারির মাধ্যমে নয়, নিম্নলিখিত কোডটি দিয়ে কীভাবে এটি করা যায় সে সম্পর্কে কোনও ধারণা: @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.DETACH) @JoinTable(name = "tbUsuariosTipoOcorrencia", joinColumns = { @JoinColumn(name = "idUsuario") }, inverseJoinColumns = { @JoinColumn(name = "idTipoOcorrencia") }) এবং আমি এটি ডাটাবেস ক্যোয়ারির মাধ্যমে সমাধান করেছি:alter table tbUsuariosTipoOcorrencia WITH NOCHECK add constraint FKnbxg3ua7b8c5d53wps69q6jh foreign key (idUsuario) references tbUsuarios
ফ্রান্সিসকো সৌজা

11

আমার ধারণা, কোনও বিদেশী কী টেবিলের একটি কলাম মান প্রাথমিক কী টেবিলের কলাম মানের সাথে মেলে। যদি আমরা দুটি টেবিলের মধ্যে একটি বিদেশী কী সীমাবদ্ধতা তৈরি করার চেষ্টা করি যেখানে একটি কলামের অভ্যন্তরের মান (বিদেশী কী হতে যাওয়া) প্রাথমিক কী সারণীর কলাম মান থেকে আলাদা হয় তবে এটি বার্তাটি ছুঁড়ে ফেলবে।

সুতরাং সর্বদা প্রাথমিক কী সারণী কলামে উপস্থিত বৈদেশিক কী কলামে কেবল সেই মানগুলি সন্নিবেশ করানোর পরামর্শ দেওয়া হয়।

প্রাক্তন জন্য। যদি প্রাথমিক টেবিল কলামে মান 1, 2, 3 এবং বিদেশী কী কলামে সন্নিবেশ করা মানগুলি পৃথক হয়, তবে কোয়েরি কার্যকর করা হবে না কারণ এটি মান 1 এবং 3 এর মধ্যে প্রত্যাশা করে।


11

আপনি টেবিলে বিদেশী কী যুক্ত করার আগে, নিম্নলিখিতগুলি করুন

  1. সারণীটি ফাঁকা থাকতে হবে বা কলামের ডেটা মিলবে তা নিশ্চিত করুন।
  2. এটি নাল নয় তা নিশ্চিত করুন।
  3. যদি সারণীতে থাকে তবে ডিজাইনে এবং পরিবর্তন করতে না গেলে ম্যানুয়ালি এটি করুন।

    টেবিল 1 পরিবর্তন করুন বিদেশী কী যুক্ত করুন (কলামের নাম) তথ্য সারণি 2 (কলামের নাম)

    টেবিল পরিবর্তন করুন সারণি 1 পরিবর্তিত কলাম কলাম নাম বৈশিষ্ট্য নাল নয়


10

আপনার টেবিলগুলি থেকে আপনার ডেটা পরিষ্কার করুন এবং তারপরে তাদের মধ্যে সম্পর্ক তৈরি করুন।


ধন্যবাদ, সর্বাধিক এটি আমার জন্য কাজ করেছিল যদি তাদের কাছে ডেটা থাকে এমনকি সম্পর্কগুলি নিখুঁত হয় তবে আপডেট-ডাটাবেস কমান্ড কাজ করবে না।
রবার্ট jebakumar2

বিদেশী কী তৈরি হওয়ার পরে যতক্ষণ না বৈধ হয় ততক্ষণ কোনও ডেটা অপসারণ করার প্রয়োজন হয় না।
jumxozizi

7

DELETEথেকে বর্তমান ডেটা চেষ্টা করে দেখুন tblDomare.PersNR। কারণ মানগুলি tblDomare.PersNRকোনও মানগুলির সাথে মেলে না tblBana.BanNR


@agenc আমি কি আপনার প্রশ্নের উত্তর দিয়েছি?
চিন্তাবিদ বেল

3

আমার এই ত্রুটিটিও ছিল কারণ স্মুত্জি পুনঃপ্রকাশ করেছিল তা নিশ্চিত করে নিন যে আপনার বেস বেসিক বিদেশী কী সারণীর বিদেশী কী কলামে আপনার রেফারেন্স সারণীতে নেই যেমন (আপনার বেস বিদেশী কী টেবিলের প্রতিটি মান (একটি কলামের মান যা বিদেশী কী) অবশ্যই আপনার রেফারেন্স টেবিল কলামে থাকতে হবে) প্রথমে আপনার বেস বিদেশী কী টেবিলটি খালি করা ভাল তারপর বিদেশী কীগুলি সেট করুন


2

আপনি যে টেবিলে প্রবেশ করেছেন (tbldomare) আপনি প্রাথমিক কী টেবিল বরাদ্দ করেছেন এমন ডেটার সাথে মেলে না। tbldomare এর মধ্যে লিখুন এবং এই শব্দটি যুক্ত করুন (nocheck সহ) তারপরে আপনার কোডটি কার্যকর করুন।

উদাহরণস্বরূপ, আপনি এই ডেটা একটি টেবিলডোমারে সারণি প্রবেশ করেছেন

INSERT INTO tblDomare (PersNR,fNamn,eNamn,Erfarenhet)
Values (6811034679,'Bengt','Carlberg',10);

এবং আপনি foreign keyকেবল একটি গ্রহণের জন্য একটি টেবিল নিয়োগ করেছেন1,2,3

আপনার দুটি সমাধান রয়েছে একটি হ'ল আপনি কোনও টেবিলে প্রবেশ করা ডেটা মুছে ফেলুন তারপরে কোডটি কার্যকর করুন। অন্যটি হ'ল এই শব্দটি লিখুন (কৌতুক সহ) এটি আপনার টেবিলের নামের মাঝে রাখুন এবং এটি যুক্ত করুন

ALTER TABLE  tblDomare with nocheck
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);

2

এটি আমার সাথে ঘটে, যেহেতু আমি আমার ডাটাবেসটি ডিজাইন করছি, আমি লক্ষ্য করেছি যে আমি আমার বীজটি আমার প্রধান টেবিলটিতে পরিবর্তন করেছি, এখন সম্পর্কিত টেবিলের মূল টেবিলে কোনও বিদেশী কী নেই।

সুতরাং আমি উভয় টেবিল কাটা প্রয়োজন, এবং এটি এখন কার্যকর!


2

আপনার টেবিলগুলির সারিগুলিতে কোনও ডেটা রয়েছে কিনা তা আপনার দেখা উচিত। যদি "হ্যাঁ" তারপর আপনি অগ্রভাগ ছাঁটিয়া উচিত টেবিল (গুলি) বা অন্য আপনি তাদের এ ডেটা একই সংখ্যক আছে করতে পারেন tblDomare.PersNRকরতে tblBana.BanNRএবং ভীসা-শ্লোক।


2

স্মুটজে সঠিক এবং চাদ হেজকক একটি দুর্দান্ত সাধারণের উদাহরণ দিয়েছেন। আইডি সেই রেকর্ডগুলি সন্ধান / মোছার উপায় সরবরাহ করে চাদের উদাহরণ তৈরি করতে চাই। আমরা গ্রাহককে সন্তানের মতো পিতা-মাতার এবং আদেশ হিসাবে ব্যবহার করব। গ্রাহকআইডি হ'ল সাধারণ ক্ষেত্র।

select * from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null 

আপনি যদি এই থ্রেডটি পড়ছেন ... আপনি ফলাফল পাবেন। এঁরা অনাথ শিশু। অর্ডার চাইল্ড থেকে * বাচ্চার উপর গ্রাহক পিতামাতার সাথে যোগ করুন নির্বাচন করুন।

আপনি এই সারিগুলি মুছতে চলেছেন ডাব্লু / আপনি যাঁর প্রয়োজন তা যাচাই করুন!

begin tran 
delete Order
from Order Child 
left join Customer Parent on Child.CustomerId = Parent.CustomerId
where Parent.CustomerId is null 

প্রথম বিট চালান। সেই সারি গণনাটি পরীক্ষা করুন = আপনি কী প্রত্যাশা করেছিলেন

ট্রান কমিট

commit tran 

সতর্ক হোন. কারও স্লোপি প্রোগ্রামিং আপনাকে এই গোলযোগের মধ্যে ফেলেছে। অনাথদের মুছার আগে আপনি কেন তা বুঝতে পেরেছেন তা নিশ্চিত করুন। হয়তো পিতামাতাকে পুনরুদ্ধার করা দরকার।


উত্তরের জন্য ধন্যবাদ. আমি স্ট্যাকওভারফ্লো ডাটাবেসের সাথে খেলছি (আসলে গেমদেব) এবং যখন আমি ব্যবহারকারীদের সাথে বাজেজে যোগদান করি তখন দুটি এনএলএল খুঁজে পাই। অবাক হওয়ার মতো কোনও প্রতিবন্ধকতা কার্যকর হয়নি ...
নিকোলাস হামফ্রে

1

আমার দৃশ্যে, EF ব্যবহার করে বিদ্যমান ডেটাতে এই নতুন বিদেশী কী তৈরি করার চেষ্টা করার পরে, আমি বিদেশী কী তৈরির পরে ভুলভাবে ডেটা পপুলেশন করার চেষ্টা করছিলাম (লিঙ্কগুলি তৈরি করুন)।

ফিক্সটি হ'ল বিদেশী কী তৈরির আগে আপনার ডেটা পপুলেট করা হয় কারণ এটি লিঙ্কগুলি সত্যই বৈধ কিনা তা দেখার জন্য এটি সমস্ত পরীক্ষা করে। সুতরাং আপনি যদি এখনও এটি জনপুষ্ট না করেন তবে এটি সম্ভবত কাজ করতে পারে না।


1

আমি আমার প্রকল্পে কিছু সমস্যা সম্মুখীন।

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

শিশু সারণীতে, কোনও রেকর্ড আইডি 1 এবং 11 এর সমান নয়

পুরোনো যাদুকর

আমি DEAL_ITEM_THIRD_PARTY_PO টেবিলটি inোকিয়েছি যা আইডি 1 এবং 11 এর সমান হয় তবে আমি এফকে তৈরি করতে পারি



0

আপনি যখন টেবিল বি তে একটি বিদেশী কী সংজ্ঞায়িত করেন সারণির A এর প্রাথমিক কীটি উল্লেখ করে এর অর্থ হ'ল যখন কোনও মান B এ থাকে তখন এটি অবশ্যই A এ হওয়া উচিত এটি টেবিলগুলিতে অসঙ্গতিপূর্ণ পরিবর্তন রোধ করা।

আপনার উদাহরণে, আপনার টেবিলগুলিতে রয়েছে:

টিবিএলডোমারে এর সাথে PRIMARY KEY (PersNR):

PersNR     |fNamn     |eNamn      |Erfarenhet
-----------|----------|-----------|----------
6811034679 |'Bengt'   |'Carlberg' |10
7606091347 |'Josefin' |'Backman'  |4
8508284163 |'Johanna' |'Backman'  |1
---------------------------------------------

tblBana:

BanNR
-----
1
2
3
-----

এই বিবৃতি:

ALTER TABLE tblDomare
ADD FOREIGN KEY (PersNR)
REFERENCES tblBana(BanNR);

বলছেন যে কোনো লাইন tblDomareকী দিয়ে PersNRটেবিল একটি correspondance থাকতে হবে tblBanaকী BanNR। আপনার ত্রুটিটি কারণ আপনি tblDomareকোনও লেনদেন ছাড়াই লাইন .োকালেন tblBana

আপনার সমস্যা সমাধানের জন্য 2 টি সমাধান : - হয় tblDomare tblBana` এর tblBanaসাথে লাইন যুক্ত করুন (তবে আপনার টেবিলটি খালি হবে)BanNR in (6811034679, 7606091347, 8508284163) - or remove all lines inthat have no correspondance in

সাধারণ পরামর্শ : সারণীগুলি স্থাপনের আগে আপনার বিদেশী কী সীমাবদ্ধতা থাকা উচিত। বিদেশী কীগুলি এখানে টেবিলের ব্যবহারকারীকে অসামঞ্জস্যতা সহ টেবিলগুলি পূরণ করা থেকে বিরত রাখতে are


-3

এবং কেবল এফওয়াইআই, যদি আপনি আপনার সমস্ত ডেটা রেফারেন্স চেক করেন এবং কোনও খারাপ ডেটা না খুঁজে পান ... সম্ভবত দুটি টেবিল এবং ক্ষেত্রের মধ্যে যেখানে ক্ষেত্রগুলি উভয় টেবিলের প্রাথমিক কী, সেখানে কোনও বিদেশী কী সীমাবদ্ধতা তৈরি করা সম্ভব নয়! আমি এটি কীভাবে জানি তা জিজ্ঞাসা করবেন না।

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