একটি কমান্ডে মাইএসকিউএল ডাটাবেসে সমস্ত সারণী ছাঁটাবেন?


346

একটি ক্রিয়াকলাপে একটি ডাটাবেসে সমস্ত টেবিল কেটে দেওয়ার জন্য কি কোনও জিজ্ঞাসা (কমান্ড) রয়েছে? আমি জানতে চাই যে আমি একটি একক ক্যোয়ারী দিয়ে এটি করতে পারি কিনা।


1
সমস্ত টেবিল কাটা? আপনি কি কোনও ডাটাবেসে সমস্ত টেবিলের সমস্ত কলামকে ছাঁটাই করতে চান? এটি কোন কোয়েরি ভাষাতে রয়েছে? (যেমন এসকিউএল, মাইএসকিউএল, ওরাকল, পোস্টগ্রিস ইত্যাদি)
জয়

আমি নিশ্চিত না যে আমি খুব সহজেই নিজেকে সমস্যায় ফেলতে পারি বলে এটি করার পরামর্শ দেব। আপনি কি কেবল ছাঁটাছুটি করতে এবং স্ক্রিপ্টটি চালাতে পারবেন না এমন কোনও কারণ আছে?
গ্রে উইজার্ডেক্স

ধন্যবাদ 4 জবাব কিন্তু কেবল স্ক্রিপ্টিং না করার কারণেই এটি অল্প সময়ের সাথে চলমান তাই মাইএসকিএল-তে একটি ক্যোয়ারী চালানোর কথা ভাবলেন
দেবং

হ্যাঁ এটি মাইএসকিএল..আর ক্যোয়ারির অর্থ টুকরো টেবিলের কাটা কাটা কাটা টানা_নাম..এখানে আমি আমার ডিবিতে সমস্ত সারণির সমস্ত সারি একটি প্রশ্নের সাথে
ছাঁটাই

আপনি কার্সার দিয়ে ইনফরমেশন_স্কেমা ব্যবহার করতে পারেন।
মাইএসকিউএল

উত্তর:


340

ড্রপ (যেমন টেবিল সরান)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done

কাটা (অর্থাত খালি টেবিল)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done

17
হ্যাঁ, পরিষ্কার, টাই তবে আপনার এটি -UUSER -pPASSWORD দিয়ে চালানোর দরকার হতে পারে। এছাড়াও আপনার যদি ক্যাসকেডে এফকে ডিলিট করা থাকে তবে আপনাকে এটি একাধিকবার চালাতে হতে পারে।
মিহাইক

47
আপনি যদি এফকে সমস্যাগুলির মধ্যে চলে যান যেমন " পিতামাতার সারিটি মুছতে বা আপডেট করতে পারে না: একটি বিদেশী কী বাধা ব্যর্থ হয় ", কমান্ডটি নিম্নরূপে সংশোধন করে বিদেশী কী চেকগুলি অক্ষম করতে ভুলবেন না:mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
ইথান পি।

24
যদিও মাইএসকিএল ক্লায়েন্ট লুপ করতে হবে না। এটি এর মতো লুপ থেকে বের করুন:mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
আলেকজান্ডার শ্যাচব্লিকিন

2
@ টাইলারকলিয়ার আপনার একটি .my.cnf
ফেলিক্স ইভ

2
উপরের উত্তর এবং মন্তব্যের ভিত্তিতে এবং সেগুলি আমার জন্য প্রত্যাশার মতো কাজ করে নি, তাই আমি একটি সাধারণ বাশ স্ক্রিপ্ট তৈরি করেছি যা আপনি এটির জন্য ব্যবহার করতে পারেন। আপনি এটি এখানে দেখতে পাবেন: gist.github.com/mocanuga/eff26a3dcc40ef657a1c812f68511f6d
mocanuga

145

মাইএসকিএল উদাহরণে একাধিক ডাটাবেস টেবিলগুলি কেটে দিন

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('db1_name','db2_name');

টেবিলগুলি কাটাতে ক্যোয়ারী ফলাফল ব্যবহার করুন

দ্রষ্টব্য: হতে পারে আপনি এই ত্রুটিটি পাবেন:

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

যদি আপনি যে টেবিলটি ড্রপ / কাটানোর চেষ্টা করছেন তার সাথে বিদেশী কীগুলির রেফারেন্স সহ টেবিলগুলি থাকে That

টেবিলগুলি কাটানোর আগে আপনাকে যা করতে হবে তা হ'ল:

SET FOREIGN_KEY_CHECKS=0;

আপনার টেবিলগুলি ছাঁটাই করুন এবং এটিকে আবার পরিবর্তন করুন

SET FOREIGN_KEY_CHECKS=1;

1
আপনার ডাটাবেসের জন্য যদি আপনার ব্যবহারকারীর এবং পাসওয়ার্ড থাকে তবে এটি সম্ভবত সেরা সমাধান এবং আপনি নিজের শেলটিতে এগুলি দৃশ্যমান টাইপ করতে চান না।
বাচ

5
আপভোটেড কারণ এই সমাধানের জন্য কেবলমাত্র ডিবি অ্যাক্সেস প্রয়োজন এবং এসএসএইচ অ্যাক্সেসের প্রয়োজন নেই। এছাড়াও এটি ওএস-ইন্ডিপেন্ডেন্ট।
মাস্তাজি

@ মাস্তাজি আমার কয়েকটি প্রশ্ন রয়েছে: ১. "টেবিল_সেমিমা" কী? এটি স্কিমা নাম থেকে দাঁড়িয়ে? ২. TABLE_NAME এর পক্ষে কী? এটি মুছে ফেলা উচিত টেবিলের জন্য দাঁড়িয়ে? ৩. আমি কি "('db1_name', 'db2_name')" এর মতো কমান্ড টিন মুছে ফেলা উচিত সেগুলি সারণিগুলি লম্বা করব?
এএইএম

@ আহমেদ কেবলমাত্র প্রয়োজনীয় বিকল্পগুলি হ'ল আপনাকে আপনার ডাটাবেসের নামের সাথে db1_name এবং db2_name প্রতিস্থাপন করতে হবে। তারপরে আপনাকে এই ক্যোয়ারির ফলাফলগুলি অনুলিপি করতে হবে এবং তাদেরকে একটি নতুন মাইএসকিএল কোয়েরি হিসাবে পেস্ট করতে হবে এবং তাদের সম্পাদন করতে হবে। INFORMATION_SCHEMA হ'ল একটি অন্তর্নির্মিত স্কিমা যা প্রতিটি মাইএসকিউএল ইনস্টলেশনে প্রাক ইনস্টল হয় এবং আপনার ডাটাবেসগুলি সম্পর্কে তথ্য রাখে, এটি স্পর্শ করবেন না বা আপনার মাইএসকিউএল খারাপ আচরণ শুরু করবে :-) টেবিল_সেমিমা এবং টেবিলের নামটি "টেবিলস" এর মধ্যে থাকা সারণীর কলামগুলি রয়েছে information_schema
mastazi

"ডিবি_নেম" দ্বারা, আপনি স্কিমার নাম বোঝাতে চাইছেন? আমার কেবলমাত্র 1 টি স্কিমা রয়েছে যা আমি এর টেবিলগুলির ডেটা মুছতে চাই
AAEM

66

এইভাবে phpMyAdmin ব্যবহার করুন:

ডাটাবেস ভিউ => সমস্ত পরীক্ষা করুন (সারণী) => খালি করুন

আপনি যদি বিদেশী কী পরীক্ষাগুলি উপেক্ষা করতে চান, আপনি যে বাক্সটি বলেছেন তা আনছেক করতে পারেন:

[] বিদেশী কী পরীক্ষাগুলি সক্ষম করুন

এই চেকবক্সটি পেতে আপনার ন্যূনতম সংস্করণ 4.5.0 বা তারও বেশি চলতে হবে।

এটি মাইএসকিউএল সিএলআই-ফু নয়, তবে ওহে, এটি কাজ করে!


31
কে বলেছিল যে আমরা পিএইচপি চালাচ্ছি ...?
jsh

37
কে বলল আমরা করিনি? এই উত্তরটি দৃশ্যত লোকেদের পক্ষে কার্যকর প্রমাণিত হয়েছে; এটা সাহায্য করে.
bzeaman

2
আপনার পিতা-সন্তানের ডেটাবেস স্কিমা থাকলে এটি কাজ করবে না।
ক্যারি বনডোক

2
বিদেশী কী বাধা ব্যর্থ হয় ails
ব্রায়ান হান্নে

2
@BrianHannay এটা জুন 2015. PMA 4.5.0 মধ্যে যোগ করা হয়েছিল আমি দেখেছি পরিবর্তণের এবং মূল ইস্যু
নিমো

24

এমএস এসকিউএল সার্ভার 2005+ (প্রকৃত বাস্তবায়নের জন্য PRINT সরান ...)

EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''

যদি আপনার ডাটাবেস প্ল্যাটফর্ম INFORMATION_SCHEMA দর্শনগুলিকে সমর্থন করে তবে নীচের ক্যোয়ারির ফলাফল নিন এবং এগুলি সম্পাদন করুন।

SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

মাইএসকিউএল এর জন্য এটি ব্যবহার করে দেখুন:

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES

কনক্যাটটিতে একটি সেমিকোলন যুক্ত করা যেমন মাইএসকিএল ওয়ার্কবেঞ্চের মধ্যে থেকে যেমন ব্যবহার করা সহজ করে তোলে।

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES

হাই..নির জবাবের জন্য ধন্যবাদ আমি এই ক্যোয়ারীটি চেষ্টা করেছিলাম কিন্তু কাজ করছে বলে মনে হচ্ছে না ... এটি কাটা টেবিলের টেবিলের নামের মতো কিছু যা আমি আমার ডিবিতে সমস্ত টেবিলের জন্য ব্যবহার করতে পারি ..
দেবং

আমি ভুলে গিয়েছিলাম যে মাইএসকিউএল সরাসরি "+" অপারেটরকে সমর্থন করে না। ত্রুটিটি ধরে নিলে, আমি উপরে কনক্যাট () উদাহরণ যুক্ত করেছি। আপনি যদি এখনও ত্রুটি বার্তা পেয়ে থাকেন তবে দয়া করে প্রকৃত ত্রুটি বার্তাটি ভাগ করুন।
সৈকত

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

3
আহা। INFORMATION_SCHEMA একটি দৃশ্য যা সক্রিয় ডাটাবেসে বিদ্যমান। আপনি যদি আপনার ডাটাবেস পরিবর্তন করেন, তবে ভিউটি সেই ডিবির বিরুদ্ধে কার্যকর করা হবে। ডাটাবেসগুলি পরিবর্তন করার সময় কোয়েরিটি সংশোধন করার দরকার নেই। কেবল এই পদক্ষেপগুলি অনুসরণ করুন: 1) সক্রিয় ডাটাবেস পরিবর্তন করুন। 2) স্ক্রিপ্ট চালান। 3) ফলাফলগুলি অনুলিপি 4) ফলাফল সম্পাদকে আবার পেস্ট করুন 5) ফলাফল কার্যকর করুন। সক্রিয় ডাটাবেসের সমস্ত সারণী এখন কাটা হয়েছে।
সৈকত

1
হুঁশিয়ার! । সব ডাটাবেস (এমনকি বেশী যে বর্তমান ডাটাবেসের মধ্যে নয় এমন এই নির্বাচন সব টেবিল মাইএসকিউএল উদাহরণ না কাজ, কিন্তু আমার ক্ষেত্রে এটি 293 সারি (টেবিল 66 পরিবর্তে) কল্পনা করুন ডেটা হারিয়ে ... ফিরে নেই
f4der

19

আমি এটি একটি ডাটাবেসে সমস্ত সারণী ফেলে দিতে পেয়েছি:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME

আপনি হোস্টিং সলিউশন দ্বারা সীমাবদ্ধ থাকলে পুরো ব্যবহারযোগ্য (পুরো ডাটাবেস ড্রপ করতে সক্ষম নয়)।

আমি টেবিলগুলি কাটাতে এটি পরিবর্তন করেছি। মাইসকিলডাম্পের জন্য কোনও "--add-truncate-table" নেই, তাই আমি এটি করেছি:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | sed -e 's/DROP TABLE IF EXISTS/TRUNCATE TABLE/g' | mysql -uUSERNAME -pPASSWORD DATABASENAME

আমার জন্য --edit কাজ করে, শেষ কমান্ডে একটি টাইপ ফিক্স করে


15
SET FOREIGN_KEY_CHECKS = 0;

SELECT @str := CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, ';')
FROM   information_schema.tables
WHERE  table_type   = 'BASE TABLE'
  AND  table_schema IN ('db1_name','db2_name');

PREPARE stmt FROM @str;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

SET FOREIGN_KEY_CHECKS = 1;

আপনি যদি বর্তমান ডাটাবেসের সাথে কাজ করতে চান (এবং এইভাবে এই কোডটি বহনযোগ্য করে তোলা) তবে সর্বশেষ শর্তটি এতে পরিবর্তন করুন SELECT:AND table_schema = DATABASE();
অ্যালেক্স

এটি আমার জন্য ছাঁটা হয় না। মাইএসকিউএল 5.7.25
লুকাস

14

আমি নীচের কোডের মতো কিছু করা খুব সহজ বলে মনে করেছি, কেবল নিজের নিজের সাথে টেবিলের নামগুলি প্রতিস্থাপন করব। গুরুত্বপূর্ণ লাইনটি সর্বদা সর্বদা SEX FOREIGN_KEY_CHECKS = 1 এ নিশ্চিত করুন;

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;

7
আপনাকে SET FOREIGN_KEY_CHECKS = 0 পুনরাবৃত্তি করতে হবে না; প্রতিটি শুরুর কমান্ড শুরুর পরের লাইনে 0 হিসাবে মোড চিহ্নিত হবে
এইচএমজিডি

12

এটি সমস্ত সারণী ছাঁটাই করতে কমান্ডটি মুদ্রণ করবে:

SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');

5
  1. কোনও টেবিলটি কাটাতে, এই টেবিলের কলামগুলিতে ম্যাপযুক্ত বিদেশী কী বাধাগুলি অন্য টেবিলগুলি থেকে (প্রকৃতপক্ষে নির্দিষ্ট ডিবি / স্কিমার সমস্ত টেবিলগুলিতে) ফেলে দিতে হবে।
  2. সুতরাং, সমস্ত বিদেশী কী সীমাবদ্ধতাগুলি প্রথমে টেবিলের কাটা দ্বারা বাদ দেওয়া উচিত।
  3. Allyচ্ছিকভাবে, ডেটা ট্র্যাঙ্কেশনের পরে ওএসে ব্যবহৃত ডেটা স্পেস / সাইজটি পুনরায় দাবি করতে অপ্টিমাইজ টেবিলটি (মাইএসকিএল, ইনানোডব ইঞ্জিন এএসপি) ব্যবহার করুন।
  4. একবার ডেটা কাটা শেষ হয়ে গেলে একই টেবিলে আবার একই বিদেশী কী বাধা তৈরি করুন। উপরের ক্রিয়াকলাপ সম্পাদনের জন্য স্ক্রিপ্ট তৈরি করতে পারে এমন একটি স্ক্রিপ্ট নীচে দেখুন।

    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,';') FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE='FOREIGN KEY' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    UNION
    SELECT CONCAT('TRUNCATE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('OPTIMIZE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' ADD CONSTRAINT ',CONSTRAINT_NAME,' FOREIGN KEY(',COLUMN_NAME,')',' REFERENCES ',REFERENCED_TABLE_NAME,'(',REFERENCED_COLUMN_NAME,');') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE CONSTRAINT_NAME LIKE 'FK%' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    INTO OUTFILE "C:/DB Truncate.sql" LINES TERMINATED BY '\n';

এখন, উত্পাদিত ডিবি ট্রাঙ্কেট.এসকিউএল স্ক্রিপ্টটি চালান

উপকারিতা। 1) ডিস্ক স্পেস পুনরায় দাবি 2) একই কাঠামো সহ ডিবি / স্কিমা ড্রপ এবং পুনরায় তৈরি করার প্রয়োজন নেই

অপূর্ণতা। 1) এফকে সীমাবদ্ধতার সীমাবদ্ধতার নামটিতে 'এফকে' থাকা নাম সহ টেবিলে নাম থাকা উচিত।


3

যদি এসকিএল সার্ভার 2005 ব্যবহার করে থাকে তবে একটি লুকানো সঞ্চিত প্রক্রিয়া রয়েছে যা আপনাকে একটি ডাটাবেসের ভিতরে থাকা সমস্ত টেবিলের বিপরীতে একটি কমান্ড বা কমান্ডের একটি সেট কার্যকর করতে দেয়। আপনি কীভাবে TRUNCATE TABLEএই সঞ্চিত প্রক্রিয়াটির সাথে কল করবেন :

EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"

এখানে আরও একটি বিশদ বিবরণ দেওয়া হয়েছে।

মাইএসকিউএল জন্য, যাইহোক, আপনি mysqldump ব্যবহার এবং নির্দিষ্ট পারে --add-drop-tablesএবং --no-dataড্রপ করতে অনেক বিকল্প এবং ডাটা উপেক্ষা সব টেবিল তৈরি করুন। এটার মত:

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]

dev.mysql থেকে mysqldump ব্যবহারের গাইড


3

এটি ব্যবহার করুন এবং ক্যোয়ারী গঠন করুন

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in (db1,db2)
INTO OUTFILE '/path/to/file.sql';

এখন এই কোয়েরিটি ব্যবহার করতে এটি ব্যবহার করুন

mysql -u username -p </path/to/file.sql

যদি আপনি এর মতো একটি ত্রুটি পান

ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint

সবচেয়ে সহজ উপায়টি হ'ল আপনার ফাইলের শীর্ষে এই লাইনটি যুক্ত করুন

SET FOREIGN_KEY_CHECKS=0;

যা বলে যে আমরা এই ফাইলটি দিয়ে যাওয়ার সময় বিদেশী কী বাধাগুলি পরীক্ষা করতে চাই না।

এটি ডিবি 1 এবং বিডি 2 ডাটাবেসে সমস্ত সারণী কেটে যাবে।


ডিবি নামগুলি কোয়েটে থাকতে হবে
রোমান এম

2

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

রেফ: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html


2

'Em all কে ছুঁড়ে ফেলার এক বিবৃতি' পেতে আমার বৈকল্পিক এখানে।

প্রথমত, আমি আমার সহায়ক সঞ্চিত পদ্ধতির জন্য 'ব্যবহার' নামে একটি পৃথক ডাটাবেস ব্যবহার করছি। সমস্ত সারণী ছিন্ন করার জন্য আমার সঞ্চিত পদ্ধতির কোডটি হ'ল:

DROP PROCEDURE IF EXISTS trunctables;
DELIMITER ;;
CREATE  PROCEDURE trunctables(theDb varchar(64))
BEGIN
    declare tname varchar(64);
    declare tcursor CURSOR FOR 
    SELECT table_name FROM information_schema.tables WHERE table_type <> 'VIEW' AND table_schema = theDb;
    SET FOREIGN_KEY_CHECKS = 0; 
    OPEN tcursor;
    l1: LOOP
        FETCH tcursor INTO tname;
        if tname = NULL then leave l1; end if;
        set @sql = CONCAT('truncate `', theDB, '`.`', tname, '`');
        PREPARE stmt from @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP l1;
    CLOSE tcursor;
    SET FOREIGN_KEY_CHECKS = 1; 
END ;;
DELIMITER ;

আপনার ব্যবহারকারীর ডাটাবেসে এই সঞ্চিত প্রক্রিয়াটি একবার হয়ে গেলে আপনি এটির মতো কল করতে পারেন

call util.trunctables('nameofdatabase');

যা এখন ঠিক একটি বিবৃতি :-)


2

আমি জানি এখানে

   SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
    FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('databasename1','databasename2');

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

যদি আপনি যে টেবিলটি ড্রপ / কাটানোর চেষ্টা করছেন তার সাথে বিদেশী কীগুলির রেফারেন্স সহ টেবিলগুলি থাকে That

টেবিলগুলি কাটানোর আগে আপনাকে যা করতে হবে তা হ'ল:

SET FOREIGN_KEY_CHECKS=0;

আপনার টেবিলগুলি ছাঁটাই করুন এবং এটিকে আবার পরিবর্তন করুন

SET FOREIGN_KEY_CHECKS=1; 

ব্যবহারকারী এই পিএইচপি কোড

    $truncate = mysql_query("SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') as tables_query FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename')");

    while($truncateRow=mysql_fetch_assoc($truncate)){

        mysql_query($truncateRow['tables_query']);

    }
?>

বিস্তারিত এখানে লিঙ্ক চেক


1

এখানে একটি পদ্ধতি যা স্থানীয় ডাটাবেসে সমস্ত সারণী ছিন্ন করা উচিত।

যদি এটি কাজ না করে তবে আমাকে জানান এবং আমি এই উত্তরটি মুছব।

অপরীক্ষিত

CREATE PROCEDURE truncate_all_tables()
BEGIN

   -- Declare local variables
   DECLARE done BOOLEAN DEFAULT 0;
   DECLARE cmd VARCHAR(2000);

   -- Declare the cursor
   DECLARE cmds CURSOR
   FOR
   SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES;

   -- Declare continue handler
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

   -- Open the cursor
   OPEN cmds;

   -- Loop through all rows
   REPEAT

      -- Get order number
      FETCH cmds INTO cmd;

      -- Execute the command
      PREPARE stmt FROM cmd;
      EXECUTE stmt;
      DROP PREPARE stmt;

   -- End of loop
   UNTIL done END REPEAT;

   -- Close the cursor
   CLOSE cmds;

END;

এটি কেন কাজ করছে না তা বোঝার জন্য আমাকে প্রচুর সময় নিয়েছে .. তারপরে এই ইমেল থ্রেডে একটি মন্তব্য সহায়তা করেছে: forums.mysql.com/read.php?61,116597,219343#msg-219343 - রেফারেন্সের জন্য : "দুর্ভাগ্যক্রমে, দেখে মনে হচ্ছে প্রস্তুত বিবৃতিগুলি কার্সারে ব্যবহার করা যাবে না the ম্যানুয়াল থেকে: dev.mysql.com/doc/refman/6.0/en/… "
টমিনেটর

1

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

আমি নীচের কোডটি বার্তা উইন্ডোতে প্রিন্ট আউট করতে ডাটাবেসের সমস্ত টেবিলের ছাঁটাই করার জন্য, বিকাশ করার আগে স্কুএল করতে চাইছি। এটিকে ভুল করা একটু শক্ত করে তোলে।

EXEC sp_MSforeachtable 'PRINT ''ALTER TABLE ? NOCHECK CONSTRAINT ALL'''
EXEC sp_MSforeachtable 'print ''DELETE FROM ?'''
EXEC sp_MSforeachtable 'print ''ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'''

0

আমি নিশ্চিত নই তবে আমি মনে করি একটি কমান্ড রয়েছে যার সাহায্যে আপনি ডাটাবেসের স্কিমাটি নতুন ডাটাবেসে অনুলিপি করতে পারবেন, এটি করা হয়ে গেলে আপনি পুরাতন ডাটাবেসটি মুছতে পারেন এবং এর পরে আপনি আবার ডাটাবেস স্কিমাটিকে পুরানো নামে অনুলিপি করতে পারবেন।


1
mysqldump -uuser -ppassword --no-data salesLeadsBrittany> বিক্রয়LeadsTemplate.sql এটি স্কিমার সাথে কেবল একটি স্কাইল ফাইল তৈরি করবে (কোনও তথ্য নেই)। আপনি এই আদেশের পরে ডেটা বেস মুছতে পারেন এবং স্কিমা আমদানি করে ডাটাবেসটি পুনরায় তৈরি করতে পারেন।
জিজে

0

আমি জানি এটি ঠিক একটি আদেশ নয়, তবে এই পদক্ষেপগুলি অনুসরণ করে পিএইচপিএমআইএডমিনের মধ্যে থেকে পছন্দসই ফলাফলটি পাওয়া যেতে পারে:

  1. সরানোর জন্য (সমস্ত) সারণী নির্বাচন করুন (সমস্ত পরীক্ষা করুন)
  2. "নির্বাচিত সহ:" তালিকা থেকে "ড্রপ" / "ট্র্যাঙ্কেট" নির্বাচন করুন
  3. নিশ্চিতকরণ পৃষ্ঠায় ("আপনি কি সত্যিই চান:") ক্যোয়ারীটি অনুলিপি করুন (লাল ব্যাকগ্রাউন্ড সহ সমস্ত কিছু)
  4. শীর্ষে যান এবং এসকিউএল-এ ক্লিক করুন এবং লিখুন: "SET FOREIGN_KEY_CHECKS = 0;" তারপরে আগের অনুলিপি করা কোয়েরিটি পেস্ট করুন
  5. "যান" ক্লিক করুন

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


0
TB=$( mysql -Bse "show tables from DATABASE" );
for i in ${TB};
    do echo "Truncating table ${i}";
    mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table DATABASE.${i}; set foreign_key_checks=1; set unique_checks=1";
    sleep 1;
done

-

ডেভিড,

কোডটি ফর্ম্যাট করতে সময় দেওয়ার জন্য আপনাকে ধন্যবাদ, তবে এটি এটি প্রয়োগ করার কথা।

-Kurt

ইউনিক্স বা লিনাক্স বাক্সে:

নিশ্চিত হন যে আপনি বাশ শেলের মধ্যে রয়েছেন। এই কমান্ডগুলি নিম্নলিখিত কমান্ড লাইন থেকে চালানো হবে।

বিঃদ্রঃ:

আমি আমার শংসাপত্রগুলি আমার ~ / .my.cnf ফাইলে সংরক্ষণ করি, সুতরাং কমান্ড লাইনে সেগুলি সরবরাহ করার দরকার নেই।

বিঃদ্রঃ:

সিপিএম হ'ল ডাটাবেসের নাম

আমি প্রতিটি কমান্ড থেকে ফলাফলের একটি ক্ষুদ্র নমুনা দেখিয়ে চলেছি।

আপনার বিদেশী কী বাধাগুলি সন্ধান করুন:

klarsen@Chaos:~$ mysql -Bse "select concat(table_name, ' depends on ', referenced_table_name)
             from information_schema.referential_constraints
             where constraint_schema = 'cpm'
             order by referenced_table_name"
  1. অনুমোদন_দেশীয়_সিস্টেম অনুমোদনের_র উপর নির্ভর করে
  2. ঠিকানা গ্রাহকের উপর নির্ভর করে
  3. গ্রাহক_পরিচয় গ্রাহকের উপর নির্ভর করে
  4. বহিরাগত_আইডি গ্রাহকের উপর নির্ভর করে
  5. শংসাপত্র গ্রাহকের উপর নির্ভর করে
  6. ইমেল_এড্রেস গ্রাহকের উপর নির্ভর করে
  7. অনুমোদনের_প্রয়োজনটি গ্রাহকের উপর নির্ভর করে
  8. গ্রাহক_স্ট্যাটাস গ্রাহকের উপর নির্ভর করে
  9. গ্রাহক_সামগ্রী গ্রাহকের উপর নির্ভর করে

সারণী এবং সারি গণনা তালিকাবদ্ধ করুন:

klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n

 1  address 297
 2  approval_external_system    0
 3  approval_request    0
 4  country 189
 5  credential  468
 6  customer    6776
 7  customer_identification 5631
 8  customer_image  2
 9  customer_status 13639

আপনার টেবিলগুলি কেটে দিন:

klarsen@Chaos:~$ TB=$( mysql -Bse "show tables from cpm" ); for i in ${TB}; do echo "Truncating table ${i}"; mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table cpm.${i}; set foreign_key_checks=1; set unique_checks=1"; sleep 1; done
  1. ছদ্মবেশের টেবিলের ঠিকানা
  2. টেবিল অনুমোদনের_সামান্য_অন্তস্থ_ সিস্টেমটি কাটা হচ্ছে
  3. টেবিল অনুমোদনের_শক্তি কাটছে
  4. টেবিলের দেশ ছাঁটাই করা
  5. টেবিল শংসাপত্র কাটা
  6. টেবিল গ্রাহককে ছাড়ানো হচ্ছে
  7. কাটা টেবিল গ্রাহক_পরিচয়
  8. টেবিলের গ্রাহক_কাজ কাটা হচ্ছে
  9. টেবিলের গ্রাহক_স্তাতাকে ছাড়ানো হচ্ছে

এটি কাজ করে যাচাই করুন:

klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n

 1  address 0
 2  approval_external_system    0
 3  approval_request    0
 4  country 0
 5  credential  0
 6  customer    0
 7  customer_identification 0
 8  customer_image  0
 9  customer_status 0
10  email_address   0

একটি উইন্ডোজ বাক্সে:

বিঃদ্রঃ:

সিপিএম হ'ল ডাটাবেসের নাম

C:\>for /F "tokens=*" %a IN ('mysql -Bse "show tables" cpm') do mysql -e "set foreign_key_checks=0; set unique_checks=0; truncate table %a; foreign_key_checks=1; set unique_checks=1" cpm

0

নিম্নলিখিত মাইএসকিউএল কোয়েরি নিজেই একটি একক কোয়েরি তৈরি করবে যা প্রদত্ত ডাটাবেসে সমস্ত টেবিলকে ছিন্ন করবে। এটি বিদেশী কীগুলি বাইপাস করে:

SELECT CONCAT(
         'SET FOREIGN_KEY_CHECKS=0; ',
         GROUP_CONCAT(dropTableSql SEPARATOR '; '), '; ',
         'SET FOREIGN_KEY_CHECKS=1;'
       ) as dropAllTablesSql
FROM   ( SELECT  Concat('TRUNCATE TABLE ', table_schema, '.', TABLE_NAME) AS dropTableSql
         FROM    INFORMATION_SCHEMA.TABLES
         WHERE   table_schema = 'DATABASE_NAME' ) as queries

0
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p drop dbname
mysqldump -u root -p < schema.sql

0

সলান 1)

mysql> select group_concat('truncate',' ',table_name,';') from information_schema.tables where table_schema="db_name" into outfile '/tmp/a.txt';
mysql> /tmp/a.txt;

সলান 2)

- Export only structure of a db
- drop the database
- import the .sql of structure 

- সম্পাদনা ----

earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result

1
এটি কেবল প্রথম টেবিলটি ফেরত আসবে বলে মনে হচ্ছে: টেবিল 1 কে ছাঁটাই করুন এবং অন্য সমস্ত টেবিলগুলি ভুলে যান।
স্টিফেন স্মিথ

এই সমাধান অবশ্যই পাগল হবে। আমি জানি না কেন এটি একটি ভোট পেল না। আমার ভুলটি যা সম্পাদনা করা হয়েছে তা হতে পারে।
অ্যাঞ্জলিন নাদের

0

এটি আমার পক্ষে কাজ করেছে। সেই অনুসারে ডাটাবেস, ব্যবহারকারীর নাম এবং পাসওয়ার্ড পরিবর্তন করুন।

mysql -Nse 'show tables' -D DATABASE -uUSER -pPWD | while read table; do echo "SET FOREIGN_KEY_CHECKS = 0;drop table \`$table\`;SET FOREIGN_KEY_CHECKS = 1;"; done | mysql DATABASE -uUSER -pPWD


-1

একটি ধারণা কেবল টেবিলগুলি ড্রপ এবং পুনরায় তৈরি করা যেতে পারে?

সম্পাদনা করুন:

@ জোনাথন লেফলার: সত্য

অন্যান্য পরামর্শ (বা আপনার সমস্ত টেবিলগুলি কাটাতে হবে না এমন ক্ষেত্রে):

সুনির্দিষ্ট সারণীগুলি ছিন্ন করার জন্য কেন কেবল একটি মৌলিক সঞ্চিত প্রক্রিয়া তৈরি করা যায় না

CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO

এটি টেবিলগুলিতে সমস্ত প্রতিবন্ধকতা, অনুমতি, মতামত, ইত্যাদি হারিয়ে ফেলে - যা একটি যথেষ্ট উপদ্রব is
জোনাথন লেফলার

আপনি মুছে ফেলতে পারেন, তারপরে কাটা কাটার পরিবর্তে সমস্ত টেবিলগুলি পুনরায় পরীক্ষা করুন। আমি ধরে নিলাম চিহ্নটি হতাশার বাইরে। আপনার ব্যাকআপটি পুনরুদ্ধার করুন।
মার্ক রেডম্যান

-5
<?php
// connect to database
$conn=mysqli_connect("localhost","user","password","database");

// check connection
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}

// sql query
$sql =mysqli_query($conn,"TRUNCATE " . TABLE_NAME);


// Print message
if ($sql === TRUE) {
  echo 'data delete successfully';
}
else {
 echo 'Error: '. $conn->error;
}

$conn->close();

?>

এখানে কোড স্নিপেট যা আমি একটি টেবিল সাফ করার জন্য ব্যবহার করি। কেবল $ সংযোগের তথ্য এবং TABLE_NAME পরিবর্তন করুন।


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