কীভাবে কোনও বিদেশী কী বাধা টেবিল কেটে যাবে?


648

কেন কাজের উপর একটি ট্রানসেট না mygroup? যদিও আমি ON DELETE CASCADE SETপেয়েছি:

ত্রুটি 1701 (42000): একটি টেবিল একটি বিদেশী কী বাধ্যতা উল্লেখ অগ্রভাগ ছাঁটিয়া পারি না ( mytestinstance, বাধ্যতা instance_ibfk_1অজানা কী ( GroupID) তথ্যসূত্র mytestmygroup( ID))

drop database mytest;
create database mytest;
use mytest;

CREATE TABLE mygroup (
   ID    INT NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB;

CREATE TABLE instance (
   ID           INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   GroupID      INT NOT NULL,
   DateTime     DATETIME DEFAULT NULL,

   FOREIGN KEY  (GroupID) REFERENCES mygroup(ID) ON DELETE CASCADE,
   UNIQUE(GroupID)
) ENGINE=InnoDB;

উত্তর:


999

আপনি TRUNCATEকোনও সারণিটিতে এফকে সীমাবদ্ধতা প্রয়োগ করতে পারবেন না (এটির TRUNCATEমতো নয় DELETE)।

এটিকে ঘিরে কাজ করতে, এই সমাধানগুলির যে কোনও একটি ব্যবহার করুন। উভয়ই ডেটা অখণ্ডতার ক্ষতি করার ঝুঁকিপূর্ণ।

বিকল্প 1:

  1. সীমাবদ্ধতাগুলি সরান
  2. সম্পাদন করা TRUNCATE
  3. এখন আর কোথাও উল্লেখ নেই এমন সারিগুলি ম্যানুয়ালি মুছুন
  4. সীমাবদ্ধতা তৈরি করুন

অপশন 2: দ্বারা প্রস্তাবিত user447951 মধ্যে তাদের উত্তর

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;

46
@barjonah: আসলে, এটা তথ্য অখণ্ডতা বিরতি পারে (দেখুন stackoverflow.com/questions/5452760/... )। সুতরাং, আপনি বাস্তব বিশ্বে যাকে "আলোক" বলছেন এটি একটি খারাপ অভ্যাস হিসাবে বিবেচনা করা হয়। পিএস:
ডাউনভোটের

1
এতিম বিদেশী কীগুলি
সন্ধানের

: আরোপ সামনে অক্ষম ফরেইন কী এছাড়াও এটি একটি দুর্দান্ত উপায়, আমি উৎস থেকে সাফল্যের সঙ্গে তা stackoverflow.com/questions/8641703/...
দুং

2
@ গোবর বিদেশী কী চেকগুলি অক্ষম করার কেবলমাত্র উন্নয়নকালীন সময়ে অনুমোদিত। এটি বিদ্যমান যে কোনও সম্পর্ককে ভেঙে দেয়। Zerkms তথ্য অখণ্ডতা সম্পর্কে 100% সঠিক। আপনি যদি এটি সম্পূর্ণরূপে খালি করার পরিকল্পনা না করেন তবে আপনি কোনও কার্যকারী ডেটাবেজে বিদেশী কী চেকগুলি অক্ষম করতে পারবেন না (বা কমপক্ষে সমস্ত সম্পর্কিত সারণী)
NoobishPro

1
@ কমলেশ এটি আমার সমাধান নয়, আমি পরামর্শ দিয়েছিলাম যে এটি বর্বরভাবে না করা।
zerkms

1308

হ্যা, তুমি পারো:

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;

এই বিবৃতিগুলির সাহায্যে, আপনি সারণিতে সারণিতে আপনার টেবিলগুলিতে FOREIGN KEYসীমাবদ্ধতাগুলি মেনে চলবেন না risk


30
আমাদের কি SET FOREIGN_KEY_CHECKS = 1 সেট করতে হবে; আবার কি পরে?
vinc3m1

77
না, আপনি না। সংযোগের সময় সেটিংসটি কেবল বৈধ। সংযোগ বিচ্ছিন্ন করার সাথে সাথেই পরবর্তী সংযোগটি এটি আবার 1 এ ফিরে আসবে
দ্য পেলমিস্টার

7
এটি রেফারেন্স সারণিতে 'অন ডিলেট' ইভেন্টটি প্রয়োগ করে না, সুতরাং এটি সম্পূর্ণ উত্তর নয়।
ওমর সাবিক

5
যদি পিএইচপিএমওয়াইডমিনে ব্যবহার করা হয় তবে আপনি যদি একই এসকিউএল উইন্ডোতে সমস্ত লেনদেন (একটি দ্বারা পৃথক ;) ব্যবহার করেন তবে এটি কাজ করে । এর কারণ প্রতিটি তাজা ওয়েব SQL কল পুনরায় সেট করবে FOREIGN_KEY_CHECKS1.
Sablefoste

1
এখানে আপনি যদি আগ্রহী হন এতিম বিদেশী কি-সংকলন (তথ্য অখণ্ডতা পুনঃস্থাপন) ক্ষেত্রে এটি একটি খুব ভাল উপায় হল http://stackoverflow.com/a/12085689/997776
SandorRacz

173

আমি কেবল এটি দিয়ে করব:

DELETE FROM mytest.instance;
ALTER TABLE mytest.instance AUTO_INCREMENT = 1;

5
স্মার্ট। আপনি যেভাবে যাইহোক সমস্ত রেকর্ড মুছতে চান, আপনি পাশাপাশি অটো বর্ধিত পুনরায় সেট করতে পারেন।
উইঙ্কব্র্যাস

6
এটি সম্ভবত এটি করার সর্বোত্তম উপায়। সীমাবদ্ধতাগুলি হারাবার ঝুঁকি নেই, কেবল সরল মুছুন। এর DELETEচেয়ে ধীর গতিতে পারফরম্যান্স করা মূল্যবান TRUNCATE। তবে যেহেতু এই ক্রিয়াটি সাধারণত খুব কমই করা হয়, তাই এটি কোনও ব্যাপার নয়।
ফিল্ড 294

আপনি যা করতে চান তা যদি হয় তবে এটি ভাল, তবে DELETEআপনার যদি অনেকগুলি সারি থাকে তবে একেবারে নৃশংস হতে পারে - যেহেতু এটি লগগুলিতে আঘাত করে, যেখানে TRUNCATEকেবল ডেটা ছিঁড়ে যায়। সত্যিই ব্যবহারের ক্ষেত্রে নির্ভর করে।
জেফ

1
আমি যখন মুছে ফেলার বিবরণটি ব্যবহার করি তখন এটি ত্রুটির 1115 টি প্রতিবেদন করে: আপনি নিরাপদ আপডেট মোড ব্যবহার করছেন, কেবল এসইটি এসকিউএলরিওউইউপিডিটি = 0 যুক্ত করুন; তাহলে এটি ঠিক আছে
tyan

এই সমাধানটি ব্যবহার করার সময়, এটি একে একে নিখুঁত করে error 1175: You are using safe update mode,...তোলার জন্য মুছে ফেলা পরিবর্তনটি প্রতিবেদন DELETE FROM mydb.mytable where id != 0করে।
শিহে ঝাং

17

আপনি করতে পারেন

DELETE FROM `mytable` WHERE `id` > 0

1
আমি এটি বার করার চেষ্টা করেছি, নিম্নলিখিত ত্রুটিটি উপস্থিত হয়েছে: ত্রুটি কোড: 1142. সারণী 'মাইটেবিল' এর জন্য 'রুট' @ 'লোকালহোস্ট' ব্যবহারকারীর ডিফল্ট আদেশটি অস্বীকার করেছে
এএইএম

বা সবে থেকে মুছে ফেলুনmytable
মিলোস্লাভ মিলো জানুয়েক

এটি স্বতঃবৃদ্ধি পুনরায় সেট করবে না।
vivek_23

13

অনুযায়ী মাইএসকিউএল ডকুমেন্টেশন , truncate ফরেইন কী সম্পর্ক সঙ্গে টেবিল ব্যবহার করা যাবে না। এএফাইক-এর কোনও সম্পূর্ণ বিকল্প নেই।

কনট্রিন্টটি ফেলে দেওয়া এখনও অপসারণ ও অপসারণের অনুরোধ করে না। এটিএম কেবলমাত্র সমাধানটিই আমি ভাবতে পারি তা হ'ল:

  • সমস্ত সারি মুছুন, বিদেশী কী বাদ দিন, ছাঁটাই, পুনরায় তৈরি কীগুলি
  • সমস্ত সারি মুছুন, পুনরায় সেট করুন স্বয়ংক্রিয়_সংশোধন (যদি ব্যবহৃত হয়)

এটি মাইএসকিউএলে ট্রানসেটটি এখনও সম্পূর্ণ বৈশিষ্ট্য নয় (এটি ট্রিগারগুলিও আহ্বান করে না)। মন্তব্য দেখুন


7
মাইএসকিউএল'র TRUNCATEঅসম্পূর্ণতা সম্পর্কে আপনার বক্তব্যটির একটি নোট - কাটা কাটা ট্রাইগার ইত্যাদি শুরু করার কথা নয় যদি এটি হয় তবে এটি ঠিক একই রকম হবে DELETE! এটি সারি-অজ্ঞান সম্পর্কিত, অতএব এটি সারি-সম্পর্কিত ক্রিয়াকলাপ করতে অক্ষম (যেমন ট্রিগারগুলি চাওয়া বা বিদেশী কী পরীক্ষা করা)। এটি ওরাকল এবং এসকিএল সার্ভারে একইভাবে কাজ করে ।
সাইমন MᶜKenzie

8

আপনি যদি পিএইচপিএমআইএডমিন ব্যবহার করছেন তবে সহজ।

কেবল ট্যাবের Enable foreign key checksঅধীনে অপশনটি চেক করুন SQLএবং রান করুনTRUNCATE <TABLE_NAME>

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


8

এই প্রশ্নটি জিজ্ঞাসা করার সময় আমি এটি সম্পর্কে জানতাম না, তবে এখন আপনি যদি পিএইচপিএমআইএডমিন ব্যবহার করেন তবে আপনি কেবল ডাটাবেসটি খুলতে পারেন এবং আপনি যে টেবিলটি কাটাতে চান তা নির্বাচন করতে পারেন।

  • নীচে রয়েছে অনেকগুলি বিকল্প সহ একটি ড্রপ ডাউন। এটি খুলুন এবং Emptyশিরোনামের নীচে বিকল্প নির্বাচন করুন Delete data or table
  • এটি আপনাকে স্বয়ংক্রিয়ভাবে পরবর্তী পৃষ্ঠায় নিয়ে যায় যেখানে চেকবক্সে ডাকা একটি বিকল্প রয়েছে Enable foreign key checks। কেবল এটি নির্বাচন না করে Yesবোতামটি টিপুন এবং নির্বাচিত টেবিলগুলি কেটে যাবে।

হতে পারে এটি অভ্যন্তরীণভাবে ব্যবহারকারী 447951 এর উত্তরে প্রস্তাবিত ক্যোরিয়াকে চালিত করে , তবে পিএইচপিএমইএডমিন ইন্টারফেস থেকে এটি ব্যবহার করা খুব সুবিধাজনক।


7

MYSQL ডাটাবেসে পরীক্ষিত abase

সমাধান 1:

SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table1;

সমাধান 2:

DELETE FROM table1;
ALTER TABLE table1 AUTO_INCREMENT = 1;
TRUNCATE table1;

এটি আমার পক্ষে কাজ করে। আমি আশা করি, এটি আপনাকেও সহায়তা করবে। এই প্রশ্ন জিজ্ঞাসা করার জন্য ধন্যবাদ।


6

উত্তরটি হ'ল জার্কम्स দ্বারা সরবরাহ করা , বিকল্প 1 তে বর্ণিত :

বিকল্প 1 : যা ডেটা অখণ্ডতার ক্ষতির ঝুঁকি না দেয়:

  1. সীমাবদ্ধতাগুলি সরান
  2. ট্রান্সকেট সম্পাদন করুন
  3. এখন আর কোথাও উল্লেখ নেই এমন সারিগুলি ম্যানুয়ালি মুছুন
  4. সীমাবদ্ধতা তৈরি করুন

জটিল অংশটি সীমাবদ্ধতা অপসারণ , সুতরাং আমি আপনাকে বলতে চাই কীভাবে যদি কেউ এটি করতে হয় তবে তার কীভাবে জানতে হবে:

  1. SHOW CREATE TABLE <Table Name>আপনার বিদেশী কী এর নাম কী তা জানতে ক্যোয়ারি চালান (নীচের চিত্রের লাল ফ্রেম):

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

  2. চালান ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>। এটি বিদেশী কী বাধা সরিয়ে ফেলবে।

  3. সম্পর্কিত সূচি (টেবিল কাঠামো পৃষ্ঠার মাধ্যমে) ফেলে দিন এবং আপনার কাজ শেষ হয়েছে।

বিদেশী কীগুলি পুনরায় তৈরি করতে:

ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);

3

কেবল ক্যাসকেড ব্যবহার করুন

TRUNCATE "products" RESTART IDENTITY CASCADE;

তবে ক্যাসকেড মোছার জন্য প্রস্তুত থাকুন)


3
ওপি মাইএসকিউএল ট্যাগ করেছে। এটি পোস্টগ্র্রেসে বৈধ হলেও এটি মাইএসকিউএলে ভুল।
পিটার

1

টেবিলগুলির জন্য ডাটাবেস ইঞ্জিনটি পৃথক হলে আপনি এই ত্রুটিটি পাবেন তাই এগুলি InnoDB এ পরিবর্তন করুন

ALTER TABLE my_table ENGINE = InnoDB;

0

পুরাতন বিদেশী কী পরীক্ষার অবস্থা এবং সিক্যুয়াল মোড পাওয়া সারণীটি কাটা / ড্রপ করার সর্বোত্তম উপায় হিসাবে মাইএসকিএল ওয়ার্কব্যাঞ্চ যেমন করে ডেটাবেজে মডেল সিঙ্ক্রোনাইজ করে do

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;`
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

DROP TABLE TABLE_NAME;
TRUNCATE TABLE_NAME;

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