একটি শিশু সারি যুক্ত বা আপডেট করতে পারে না: একটি বিদেশী কী বাধা ব্যর্থ হয়


174

1 নং টেবিল

+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| UserID   | int(11)     | NO   | PRI | NULL    | auto_increment |
| Password | varchar(20) | NO   |     |         |                |
| Username | varchar(25) | NO   |     |         |                |
| Email    | varchar(60) | NO   |     |         |                |
+----------+-------------+------+-----+---------+----------------+

টেবিল ২

+------------------+--------------+------+-----+---------+----------------+
| Field            | Type         | Null | Key | Default | Extra          |
+------------------+--------------+------+-----+---------+----------------+
| UserID           | int(11)      | NO   | MUL |         |                |
| PostID           | int(11)      | NO   | PRI | NULL    | auto_increment |
| Title            | varchar(50)  | NO   |     |         |                |
| Summary          | varchar(500) | NO   |     |         |                |
+------------------+--------------+------+-----+---------+----------------+

ত্রুটি:

com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: 
Cannot add or update a child row: a foreign key constraint fails 
(`myapp/table2`, CONSTRAINT `table2_ibfk_1` FOREIGN KEY (`UserID`) 
REFERENCES `table1` (`UserID`)) 

আমি কি ভুল করেছি? আমি http://www.w3schools.com/Sql/sql_foreignkey.asp পড়েছি এবং আমি কি দেখতে পাচ্ছি না।


4
আপনি কি কোয়েরি পোস্ট করতে পারেন যা ত্রুটিটি ট্রিগার করে?
স্যাঁতসেঁতে

38
সংক্ষেপে, আপনি table2.UserIDযে মানটি বিদ্যমান নেই তার মধ্যে সন্নিবেশ / আপডেট করার চেষ্টা করছেন table1.UserID
জো স্টেফেনেলি

কেন নিশ্চিত না তবে আমার উইন্ডোজের পরিবেশ থেকে লিনাক্সে আমার ডাটাবেস সরিয়ে নেওয়ার পরে, আমাকে একটি সম্পর্ক মুছতে এবং পুনরায় তৈরি করতে হয়েছিল (এটি যখন আমি বিষয়টি লক্ষ্য করেছি তখন)। মানটি বিদ্যমান ছিল, তবে সম্পর্কটি সরিয়ে এবং পুনরায় যুক্ত করা এটি ঠিক করে দিয়েছে। স্পষ্টতই আপনার এই কাজটি করতে বেশ যত্নবান হতে হবে।
জনস্নেলগুলি

উত্তর:


235

আপনি এই ত্রুটিটি পেয়ে যাচ্ছেন কারণ আপনি বর্তমানে সঞ্চিত মানের উপর ভিত্তি করে ক্ষেত্রটির table2জন্য কোনও বৈধ মান নেই এমন একটি সারি যুক্ত / আপডেট করার চেষ্টা করছেন । আপনি যদি আরও কিছু কোড পোস্ট করেন তবে আমি আপনাকে নির্দিষ্ট কারণ নির্ণয় করতে সহায়তা করতে পারি।UserIDtable1


প্রিপারেশনস্টেটমেন্ট st = সংযোগ.প্রিপার স্টেটমেন্ট ("টেবিল 2 intoোকান (ইউজারআইডি, পোস্টআইডি, শিরোনাম, সংক্ষিপ্তসার)" + "মান (ইউজারআইডি,?,???"));
টম

15
ডাউনভোটটি কী তা নিশ্চিত নয়; আমার উত্তর পুরোপুরি বৈধ এবং সঠিক।
ব্রায়ান ড্রিসকল

হুঁ ... আপনার প্রস্তুত বিবৃতিতে নামবিহীন প্যারামিটারগুলির সাথে নামযুক্ত প্যারামিটারগুলি মিশ্রিত করা অবশ্যই ভাল ধারণা নয়। এটি আপনার নির্বাহ বিবৃতিতে উল্লিখিত ইউজারআইডি-র উপযুক্ত মান সহ "মান (?,?,??)" হওয়া উচিত।
ব্রায়ান ড্রিসকল

সুতরাং টেবিল 1 থেকে ইউজারআইডি পেতে আমাকে অন্য এসকিউএল স্টেটমেন্টটি করতে হবে?
টম

5
খুব সম্ভবত 0, ঘটনাটি যদি নুল দ্বারা প্রতিস্থাপন করুন
জেফ্রি নিকলসন ক্যারি

123

এর মানে আপনি মধ্যে সন্নিবেশ করার চেষ্টা করছেন table2একটি UserIDমান বিদ্যমান নেই table1


104

একটি সাধারণ হ্যাকটি হ'ল টেবিলে কোনও ক্রিয়াকলাপ সম্পাদন করার আগে বিদেশী কী চেকগুলি অক্ষম করা। সহজ জিজ্ঞাসা

SET FOREIGN_KEY_CHECKS=0

এটি অন্য কোনও টেবিলের বিপরীতে বিদেশী কী মেলানো অক্ষম করবে। আপনি টেবিলটি সম্পন্ন করার পরে এটি আবার সক্ষম করুন

SET FOREIGN_KEY_CHECKS=1

এটি আমার জন্য অনেক বার কাজ করে।


আমি কিভাবে এটি ব্যবহার করি ??
শচীন পুণে

2
@ সাচিনফ্রমপুন মাত্র SET FOREIGN_KEY_CHECKS = 0 যোগ করুন; মাইএসকিএল ফাইল শুরু করার সময় এবং সেট ফররেগ_কেই_ CHECKS = 1;
মাইএসকিএল

1
এই সমস্যাযুক্ত না? আপনি রেফারেন্সিয়াল অখণ্ডতা হারাবেন, তাই না?
Roadrunner66

রেফারেনশিয়াল অখণ্ডতা সঠিক সূচক প্রবেশের উপস্থিতি দ্বারা সমর্থিত। যতক্ষণ আপনি আপনার কী এবং সূচকগুলি সঠিকভাবে পেয়েছেন ততক্ষণ আপনার বাল্ক ইনপুট চলাকালীন চেকটি অক্ষম করতে সক্ষম হওয়া উচিত।
ভার্নন কেইনান

46

আমি অন্য একটি অদ্ভুত কেসটি আবিষ্কার করেছি: আপনি যদি ঘটনাক্রমে কোনও ইনোডিবি টেবিল থেকে মাইআইএসএএম টেবিলের জন্য একটি বিদেশী কী তৈরি করেন, তবে ডেটা অন্যথায় বৈধ থাকলেও মাইএসকিউএল প্রবেশের সময় এই ত্রুটিটি ছুড়ে ফেলে।

Http://nick.zoic.org/art/mysql-foreign-key-error/ দেখুন


1
হ্যাঁ, আমারও একই সমস্যা। দুটি টেবিল ইনোডিবি হওয়া উচিত!
পান্না

2
আমি একই সমস্যা ছিল, টিপ জন্য ধন্যবাদ। এখানে মাইএসএএমএল থেকে InnoDB কে রূপান্তর করতে মাইএসকিউএল ডকুমেন্টেশনের একটি লিঙ্ক দেওয়া হয়েছে dev.mysql.com/doc/refman/5.7/en/… টিএলডিআর: টেবিলের টেবিলের নাম ENGINE = InnoDB;
গিলহার্ম ওয়াজ

প্রকৃতপক্ষে, আমার ডাটাবেসে এটি ছিল। আমি মাইআইএসএএম ইঞ্জিনকে ইনোডিবিতে পরিবর্তন করার সিদ্ধান্ত নিয়েছি। অবশেষে, আমি যেভাবে চেয়েছিলাম ডাটাবেসটির সাথে কাজ করতে পারি।
মাইক

17

আপনি এই ত্রুটিটি পাচ্ছেন কারণ এমন কিছু মান ইন্টি table2.UserIDরয়েছে যা বিদ্যমান নেই table1.UserID(আমার ধারণা table2.UserIDআপনি এই বিদেশী কী তৈরির আগে মান ম্যানুয়ালটি সেট করে রেখেছেন)।
এই দৃশ্যের জন্য একটি উদাহরণ: table1.UserID1,2,3 table2.UserIDমান পান এবং 4 টি মান পান (ম্যানুয়াল অনুসারে যোগ করুন)। সুতরাং যখন আপনি একটি বিদেশী কী করতে, তারা খুঁজে পাচ্ছেন না UserID = 4থেকে table1এবং ত্রুটি ocurse হবে।
এই ত্রুটিটি ঠিক করতে, কেবল এখান UserID = 4থেকে সরান table2বা আপনি উভয়টি খালি করতে পারেন এবং তারপরে বিদেশী কী এবং তৈরি করতে পারেন।
শুভকামনা!


11

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

যেমন টেবিল 2 এর নিম্নলিখিত তথ্য রয়েছে:

UserID    PostID    Title    Summary
5         1         Lorem    Ipsum dolor sit

1 নং টেবিল

UserID    Password    Username    Email
9         ********    JohnDoe     john@example.com

আপনি যদি টেবিল 2 পরিবর্তনের চেষ্টা করে এবং একটি বিদেশী কী যুক্ত করেন তবে কোয়েরিটি ব্যর্থ হবে কারণ ইউজারআইডি = 5 সারণি 1 তে বিদ্যমান নেই।


10

আপনি যদি টেবিল 2-এ বিদেশী কী তৈরির আগে টেবিল 1 এ একটি সারি সন্নিবেশ করিয়েছেন তবে আপনি একটি বিদেশী কী বাধা ত্রুটি পেয়ে যাবেন, কারণ অটো বর্ধনের মান টেবিল 1-এ 2 এবং টেবিলের 1 তে 2 এটি সমাধান করার জন্য আপনাকে অবশ্যই টেবিল 1 কেটে ফেলুন এবং অটো বর্ধিত মানটি 1 এ সেট করুন Then তারপরে আপনি টেবিল 2 যুক্ত করতে পারেন।


10

আপনি InnoDB তে ডাটাবেস ইঞ্জিন সেট করেছেন তা নিশ্চিত করুন কারণ মাইআইএসএএম-তে বিদেশী কী এবং লেনদেন সমর্থিত নয়


2
টেবিল my_table ENGINE = InnoDB;
বিশ্ব মিশ্র

7

সামান্য কিছুটা ঠিক করুন : টেবিল 1-এ জোন্ডকালামকে 'nullable = true' এবং টেবিল 2-তে 'ইউজারআইডি' ক্ষেত্র 'সন্নিবেশযোগ্য = মিথ্যা' এবং 'nullable = true' করুন।

সারণী 1 সত্তায়:

@OneToMany(targetEntity=Table2.class, cascade = CascadeType.ALL)
@JoinColumn(name = "UserID", referencedColumnName = "UserID", nullable = true)
private List<Table2> table2List;

টেবিল 2 সত্তায়:

@Column(insertable = false, nullable = true)
private int UserID;

এই উত্তরটি পুরোপুরি আমার সমস্যার সমাধান করেছে, এটি ভাগ করে নেওয়ার জন্য আপনাকে অনেক ধন্যবাদ। আমার পক্ষে কীটি আমার সন্তানের অবজেক্ট / সারণীতে ফোড়িং কী হিসাবে ব্যবহার করা হচ্ছে এমন দায়ের করা ফাইলটিতে @ কলাম (সন্নিবেশযোগ্য = মিথ্যা, নমনীয় = সত্য) যুক্ত করা হয়েছিল।
ইস্রায়েল

6

আমি ঠিক একই সমস্যা ছিল সমাধান সহজ।

আপনি সন্তানের টেবিলে একটি আইডি যুক্ত করার চেষ্টা করছেন যা পিতামাতার টেবিলে বিদ্যমান নেই

ভাল করে পরীক্ষা করুন, কারণ InnoDB- তে এমন বাগ রয়েছে যা কখনও কখনও মানগুলি না যুক্ত করে অটো_সংশ্লিষ্ট কলামকে বাড়িয়ে তোলে, উদাহরণস্বরূপ, INSERT ... ON DUPLICATE KEY


গম্ভীরভাবে? অস্তিত্ব নেই এমন একটি আইডি রেফারেন্স প্রবেশ করান না ... কেবল পরীক্ষা করুন
ব্লেজটিক্স

5

আমারও একি দশা. আপনি কোনও টেবিলটিতে বিদেশী কী প্রয়োগ করার চেষ্টা করছেন যা কন্টেন্টযুক্ত এবং কলামটি প্রবিহীন নয়। আপনার কাছে দুটি বিকল্প রয়েছে।

  1. আপনি যে কলামটি বিদেশী কী সীমাবদ্ধতাগুলি প্রয়োগ করতে চান তা নিক্ষেপযোগ্য করে তুলুন। এই পদ্ধতিতে বিদেশী কী প্রয়োগ করে প্রযোজ্য হবে যে জেনে কিছু ক্ষেত্র নালাম হতে পারে। ( আমি এটিই করেছি। )
  2. আপনি যে কলামটি বিদেশী কী সীমাবদ্ধতা প্রয়োগ করতে চান তা তৈরি করুন, কলামে বিদেশী কী সন্নিবেশ করানোর জন্য একটি কোয়েরি লিখুন এবং তারপরে বিদেশী কী সীমাবদ্ধতাগুলি প্রয়োগ করুন। ( এটি চেষ্টা করে দেখেনি তবে এটি কাজ করা উচিত )

4

আপনি যে বিদেশী কীতে সন্নিবেশ করছেন সেই মানটি পিতামাতার টেবিলে উপস্থিত রয়েছে তা নিশ্চিত করুন। এটি আমাকে সাহায্য করেছিল। উদাহরণস্বরূপ আপনি যদি sert user_id = 2োকান table.2, তবে table.1একটি না থাকে user_id = 2, তবে সীমাবদ্ধতা একটি ত্রুটি নিক্ষেপ করবে। আমার সঠিক হতে ত্রুটি কোড # 1452 ছিল। আশা করি এটি একই সমস্যার সাথে অন্য কাউকে সহায়তা করে!


3

আমার একই সমস্যা ছিল এবং কারণটি হ'ল বিদেশী কী যুক্ত করার আগে আমার প্রথম টেবিলটিতে একটি সারি ছিল।


1

আমিও একই সমস্যার মুখোমুখি হয়েছিলাম এবং সমস্যাটি ছিল আমার পিতামাতার সারণী এন্ট্রিগুলির সাথে বিদেশী কী টেবিল মানের সাথে মেলে না। সুতরাং দয়া করে সমস্ত সারি পরিষ্কার করার পরে চেষ্টা করুন ..


সীমাবদ্ধতার প্রয়োজন যে টেবিল 2 এ উল্লেখ করা ব্যবহারকারীরা ইতিমধ্যে টেবিল 1 এ সংজ্ঞায়িত করা উচিত।
sorak

1

যদি অন্যের সরবরাহিত সমাধানগুলি কাজ না করে তবে। তারপরে আপনার প্যারেন্ট এবং চাইল্ড টেবিলগুলির ডেটাবেস ইঞ্জিনগুলি পরীক্ষা করার চেষ্টা করা উচিত my আমার ক্ষেত্রে, আমার প্যারেন্ট টেবিলগুলির ইঞ্জিনটি "মাইআইএসএএম" তে সেট করা হয়েছিল, এটি এএনএনডিবিতে পরিবর্তন করে এটি ঠিক করা হয়েছে।

আশা করি এটি আমার মতো আটকে থাকা অন্যদের সহায়তা করবে।


1

আপনার ডাটাবেসে একটি ক্যাসকেডের বিরুদ্ধে একটি অনডিলিট ফিল্ড স্থাপন করা উচিত নয়।

তাই অনডিলিট ফিল্ডটি রিআরসিআরসিটিতে সেট করুন

শুভকামনা ♥


0

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

টেবিলটি এত বিভ্রান্ত হয়েছিল যে কোনও ALTER TABLE আদেশ দ্বারা এটি ঠিক করা যায়নি । অবশেষে আমি টেবিলটি ফেলে দিয়ে এটি পুনর্গঠন করেছি। এটি নিখরচায়তা থেকে মুক্তি পেয়েছে।


0

সম্ভবত আপনি userIDকলামটি যুক্ত করেছেন , সেই নির্দিষ্ট টেবিলের জন্য একটি ডেটা রয়েছে যা এটি প্রতিষ্ঠিত হয়েছে সুতরাং এটির একটি ডিফল্ট মান থাকবে 0, এটি ছাড়া কলামটি যুক্ত করার চেষ্টা করুনNOT NULL


0

আমি এই ত্রুটিটিটি পেয়েছি: "একটি শিশু সারি যুক্ত বা আপডেট করতে পারে না: একটি বিদেশী কী বাধা ব্যর্থ হয়"। মূল টেবিলে একটি নতুন সারি যুক্ত করার সময় আমি ত্রুটি পেয়েছি

সমস্যাটি হ'ল চাইল্ড টেবিলের পরিবর্তে মূল টেবিলে বিদেশী কী সীমাবদ্ধতার সংজ্ঞা দেওয়া হয়েছিল।


0

যদি আপনি মাইএসকিএল সূচক বা টেবিলগুলির মধ্যে সম্পর্ক ব্যবহার করেন তবে প্রথমে আপনি কলমগুলি মুছবেন (উদাহরণস্বরূপ: সিটি_আইডি) এবং একই নামে নতুন কলম তৈরি করুন (উদাহরণস্বরূপ: সিটি_আইডি) .এখন আবার চেষ্টা করুন ...


0

সারণীতে থাকা কোনও বিদ্যমান ডেটা আছে কি? যদি তা হয় তবে আপনি যে বিদেশী কী যুক্ত করতে চান সেই টেবিলের সমস্ত ডেটা সাফ করার চেষ্টা করুন। তারপরে আবার কোডটি চালান (একটি বিদেশী কী যুক্ত করুন)।

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

আশা করি এটি কাজ করে :)


0

টেবিল 2 এর ব্যবহারকারী ID ক্ষেত্রের সূচিগুলি মুছুন। এটি আমার জন্য উপযুক্ত


-1

চাইল্ড টেবিল বিদেশী কী বাধা ব্যর্থ হচ্ছে

নিম্নলিখিত কারণে এই সমস্যাটি উঠতে পারে:

যদি আপনি এটি স্প্রিং এমভিসি তে করছেন তবে আপনার আইডি প্রকারটি স্পষ্টভাবে বর্ণনা করতে হবে, কারণ কখনও কখনও মাইএসকিএল আইডির ধরণটি সনাক্ত করতে ব্যর্থ হয়। সুতরাং আপনি আপনার সত্তা শ্রেণীর উভয় সারণীতে স্পষ্টভাবে সেট করেছেন@GeneratedValue (strategy = GenerationType.IDENTITY)

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