মাইএসকিউএল বিদেশী কী উপেক্ষা করে সমস্ত টেবিল ড্রপ করে


402

কোনও মাইএসকিউএল ডাটাবেস থেকে সমস্ত টেবিল ফেলে দেওয়ার কোনও সহজ উপায় কি সেখানে থাকা বিদেশী কী বাধাগুলিকে উপেক্ষা করে?


1
আপনার যদি অন্যান্য প্রচুর সত্ত্বা না থাকে তবে কেবলমাত্র ডেটাবেস ড্রপ করুন এবং স্ক্র্যাচ থেকে শুরু করবেন না কেন?
স্টুয়ার্টএলসি

161
ব্যবহারকারী priveleges সংরক্ষণ করতে।
বিসিএমসিএফসি

5
আমি ঠিক বুঝতে পেরেছি যে ইতিমধ্যে আপনি ডিওন ট্রুটারের একটি উত্তর পেয়েছেন যা আমার চেয়ে সম্পূর্ণ সম্পূর্ণ এবং পরিবর্তে এটি গ্রহণ করার পরামর্শ দিয়েছেন। (" সমস্ত টেবিলগুলি ফেলে দিন " অংশটি আমার দ্বারা আচ্ছাদিত নয়)
চিককোডোরো

5
আপনি যদি পিএইচপিএমওয়াই অ্যাডমিন ইনস্টল করে থাকেন তবে সমস্ত টেবিল নির্বাচন এবং সেগুলি ড্রপ করা সহজ f
ব্যবহারকারী

1
এটি সত্য তবে সংস্করণ 4.x সংস্করণে শুধুমাত্র phpMyAdmin এর জন্য আপনি যদি সমস্ত টেবিল নির্বাচন করেন Dropএবং ড্রপডাউন মেনু থেকে চয়ন করেন তবে আপনি Foreign key checkচেকবাক্সটি নির্বাচন করতে পারবেন না ।
jmarceli

উত্তর:


473

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

  1. আপনার ডাটাবেসে উত্পন্ন ড্রপগুলি এর মতো সীমাবদ্ধ করুন:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';

দ্রষ্টব্য 1: এটি DROP বিবৃতিগুলি কার্যকর করে না, এটি আপনাকে সেগুলির একটি তালিকা দেয়। এগুলি কার্যকর করতে আপনাকে আপনার এসকিউএল ইঞ্জিনে আউটপুটটি কেটে পেস্ট করতে হবে।

দ্রষ্টব্য 2: আপনার যদি ভিউ থাকে তবে আপনাকে প্রতিটি DROP TABLE `VIEW_NAME`বিবৃতি DROP VIEW `VIEW_NAME`ম্যানুয়ালি সংশোধন করতে হবে ।

  1. দ্রষ্টব্য, প্রতি http://dev.mysql.com/doc/refman/5.5/en/DP-table.html প্রতি , ক্যাসকেড সহ ফেলে আসা অর্থহীন / বিভ্রান্তিকর:

"রিস্ট্রাক্ট এবং ক্যাসকেডকে পোর্টিং সহজ করার অনুমতি দেওয়া হয়েছে। মাইএসকিউএল 5.5-এ, তারা কিছুই করে না।"

অতএব, ড্রপ বিবৃতি কাজ করার জন্য আপনার প্রয়োজন হলে:

SET FOREIGN_KEY_CHECKS = 0

এটি রেফারেন্সিয়াল অখণ্ডতা পরীক্ষাগুলি অক্ষম করবে - সুতরাং আপনার প্রয়োজনীয় ড্রপগুলি সম্পাদন করার পরে আপনি কী পরীক্ষার সাথে পুনরায় সেট করতে চাইবেন

SET FOREIGN_KEY_CHECKS = 1
  1. চূড়ান্ত মৃত্যুদন্ড কার্যকর হওয়া উচিত:
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;

এনবি: সহজেই নির্বাচনের আউটপুট ব্যবহার করতে, মাইএসকিএল-বি বিকল্প সাহায্য করতে পারে।


6
@ টিএমএমএম: আমি আমার উত্তরে 3 টি ফোঁটা লিখেছি - তবে এটি তাদের কার্যকর করে না। আপনাকে এগুলি স্ট্যাকওভারফ্লো থেকে অনুলিপি করতে হবে এবং এগুলি আপনার মাইএসকিউএল ওয়ার্কবেঞ্চ বা হুইভারে পেস্ট করতে হবে। উপরের বাছাইয়ের সাথে আপনি সমস্ত ফ্রি "ফ্রি" ড্রপ পেয়ে যাবেন। আপনাকে কেবল তাদের কপি-পেস্ট করতে হবে।
চিককডোরো

3
হ্যাঁ আমি জানি, তবে আমি এটি একটি স্ক্রিপ্টে ব্যবহার করতে চেয়েছিলাম। আমি আসলে DROP DATABASE foo; CREATE DATABASE foo;যা করতে পেরেছি তা হ'ল , যা বেশিরভাগ নয় তবে আমার পক্ষে কাজ করেছে।
টিম্ম্ম্ম

2
শত শত টেবিল থাকাকালীন সুবিধাজনক নয়, তবে ডাটাবেস পুনরুদ্ধার করা কোনও বিকল্প না হলে কোনও কিছুর চেয়ে ভাল।
নিকোলাস রাউল

2
@ টিম্ম্ম্ম: এটি আবার দেখছেন - আপনি ঠিক বলেছেন, এটি পুরোপুরি প্রশ্নের উত্তর দেয় না। জিনের উত্তরটি আশাব্যঞ্জক বলে মনে হচ্ছে - এটি উভয়ই ডিআআরপি বিবৃতিগুলি স্বয়ংক্রিয়ভাবে উত্পন্ন করে এবং কার্যকর করে, সঠিকভাবে আগে এবং পরে SET FOREIGN_KEY_CHECKS প্রয়োগ করার সময়।
চিককোদোর

1
টার্মিনালটি ব্যবহার করুন যদি আপনি লিনাক্স বা ম্যাকে থাকেন এবং এটি আপনার মাইএসকিএল অ্যাকাউন্টের ধরণে লগইন করতে কাজ করবে: mysql -u <ব্যবহারকারীর> -p তারপরে এখন পাসওয়ার্ড নির্বাচন করে ডাটাবেস প্রবেশ করুন এবং তারপরে টেবিলগুলি মুছতে উপরের কোডটি লিখুন
ismnoiet

132

Http://www.devdaily.com/blog/post/mysql/DP-mysql-tables-in-any-order-foreign-keys থেকে :

SET FOREIGN_KEY_CHECKS = 0;
drop table if exists customers;
drop table if exists orders;
drop table if exists order_details;
SET FOREIGN_KEY_CHECKS = 1;

(নোট করুন যে এটি সুনির্দিষ্ট ক্রমে টেবিলগুলি ফেলে দিতে সক্ষম হওয়ার জন্য কীভাবে বিদেশী কী চেকগুলি নিষ্ক্রিয় করবেন answers এটি কীভাবে উত্তর দেয় না যে সমস্ত বিদ্যমান টেবিলের জন্য কীভাবে স্বয়ংক্রিয়ভাবে ড্রপ-টেবিল বিবৃতি উত্পন্ন করা যায় এবং সেগুলি একক স্ক্রিপ্টে কার্যকর করা যায় Je জিনের উত্তর না।)


10
আপনি যদি মাইএসকিউএল ওয়ার্কবেঞ্চ ব্যবহার করেন, আপনি বাম কলামের সমস্ত টেবিল নির্বাচন করে ডান-ক্লিক করে, 'ড্রপ টেবিল' বিকল্পটি ব্যবহার করে সমস্ত টেবিলের নাম টাইপ করা এড়াতে পারবেন। এটি এসকিউএল উত্পন্ন করবে যা আপনি SET FOREGIN_KEY_CHECKS বিবৃতিটির মধ্যে অনুলিপি এবং পেস্ট করতে পারবেন - অন্য জিইউআইয়ের ক্ষেত্রেও সম্ভবত এটি একই রকম।
ক্রিস

ধন্যবাদ সহায়ক, এবং @ ক্রিস সুপার সহায়ক, একটি উত্তর যুক্ত করা উচিত
অ্যান্ড্রু

97

এখানে SurlyDre এর সঞ্চিত পদ্ধতিটি পরিবর্তিত হয়েছে যাতে বিদেশী কী উপেক্ষা করা হয়:

DROP PROCEDURE IF EXISTS `drop_all_tables`;

DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
    DECLARE _done INT DEFAULT FALSE;
    DECLARE _tableName VARCHAR(255);
    DECLARE _cursor CURSOR FOR
        SELECT table_name 
        FROM information_schema.TABLES
        WHERE table_schema = SCHEMA();
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;

    SET FOREIGN_KEY_CHECKS = 0;

    OPEN _cursor;

    REPEAT FETCH _cursor INTO _tableName;

    IF NOT _done THEN
        SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
        PREPARE stmt1 FROM @stmt_sql;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;
    END IF;

    UNTIL _done END REPEAT;

    CLOSE _cursor;
    SET FOREIGN_KEY_CHECKS = 1;
END$$

DELIMITER ;

call drop_all_tables(); 

DROP PROCEDURE IF EXISTS `drop_all_tables`;

2
টেবিলগুলিতে কাজ করে, দর্শনগুলি মুছতে ব্যর্থ হয়। তবুও আমার টাইপিং ব্যাপকভাবে হ্রাস করেছে :) thx।
ক্রিসিনমটাউন

7 বছর পরে আমি বলব আপনার _tableNameব্যাককোটিস দিয়ে মোড়ানো উচিত । অন্যথায় এটি কিছু টেবিলের মতো groupবা অন্যান্য কীওয়ার্ডে ব্যর্থ হবে ।
শশাইরো

মতামত যত্ন নিন! তথ্য_চেমার কাছ থেকে টেবিলের নাম নির্বাচন করুন T টেবিলগুলি যেখানে টেবিল_শেমি = SCHEMA () এবং টেবিলের টাইপ = "বেস টেবিল";
লরেন্ট বেলোয়েল

42

উপরের প্রতিটি পদ্ধতির মধ্যে এই এএএএফসিটি থেকে অনেক বেশি কাজ রয়েছে ...

( mysqldump --add-drop-table --no-data -u root -p database | grep 'DROP TABLE' ) > ./drop_all_tables.sql
mysql -u root -p database < ./drop_all_tables.sql

2
কেন শুধু পাইপ mysqldumpথেকে mysql, একটি ফাইল মাধ্যমে যাওয়া ছাড়া?
রল্ফ

2
@ রোল্ফের কোনও বিশেষ কারণ নেই। নিজেকে নক আউট।
স্কাইলিচ

2
ধন্যবাদ, আমি ইতিমধ্যে করেছিল প্রথম বন্ধনী মুছে ফেলেছি এবং পাইপ mysqldumpমধ্যে grepমধ্যে mysql, এটি কাজ করে। আপনার সমাধানের জন্য আবার ধন্যবাদ, এটা ভাল।
রল্ফ

5
এইটি বিদেশী কী বাধাগুলি হারিয়েছে; আমি আপনার উত্তরের ভিত্তিতে এখানে একটি বাশ স্ক্রিপ্ট যুক্ত করেছি: gist.github.com/cweinberger/c3f2882f42db8bef9e605f094392468f
cweinberger

স্মুওooooooo স্মার্ট!
zx1986

25

এই উত্তর থেকে ,

এক্সিকিউট:

  use `dbName`; --your db name here
  SET FOREIGN_KEY_CHECKS = 0; 
  SET @tables = NULL;
  SET GROUP_CONCAT_MAX_LEN=32768;

  SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name, '`') INTO @tables
  FROM   information_schema.tables 
  WHERE  table_schema = (SELECT DATABASE());
  SELECT IFNULL(@tables, '') INTO @tables;

  SET        @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
  PREPARE    stmt FROM @tables;
  EXECUTE    stmt;
  DEALLOCATE PREPARE stmt;
  SET        FOREIGN_KEY_CHECKS = 1;

এটি বর্তমানে ব্যবহৃত ডাটাবেস থেকে টেবিলগুলি ড্রপ করে। আপনি ব্যবহার করে বর্তমান ডাটাবেস সেট করতে পারেন use


অথবা অন্যথায়, ডিওনের গৃহীত উত্তরটি সহজ, আপনি দু'বার সম্পাদন করতে হবে, প্রথমে ক্যোয়ারীটি পেতে, এবং দ্বিতীয়টি কোয়েরি চালানোর জন্য। আমি ডিবি এবং টেবিলের নামগুলিতে বিশেষ অক্ষরগুলি এড়াতে কিছু বোকা ব্যাক-টিক সরবরাহ করেছি।

  SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
  FROM   information_schema.tables
  WHERE  table_schema = 'dbName'; --your db name here

সংক্ষিপ্ত এবং পরিষ্কার সমাধান। পদ্ধতির বিকল্পের চেয়ে ভাল উপায়।
রাফায়েল রেনান পাচেকো

16

এখানে একটি কার্সার ভিত্তিক সমাধান। কিন্ডা লম্বা তবে একটি একক এসকিউএল ব্যাচ হিসাবে কাজ করে:

DROP PROCEDURE IF EXISTS `drop_all_tables`;

DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
    DECLARE _done INT DEFAULT FALSE;
    DECLARE _tableName VARCHAR(255);
    DECLARE _cursor CURSOR FOR
        SELECT table_name 
        FROM information_schema.TABLES
        WHERE table_schema = SCHEMA();
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;

    OPEN _cursor;

    REPEAT FETCH _cursor INTO _tableName;

    IF NOT _done THEN
        SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
        PREPARE stmt1 FROM @stmt_sql;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;
    END IF;

    UNTIL _done END REPEAT;

    CLOSE _cursor;

END$$

DELIMITER ;

call drop_all_tables(); 

DROP PROCEDURE IF EXISTS `drop_all_tables`;

2
দুর্দান্ত, তবে দুর্ভাগ্যক্রমে এটি বিদেশী কীগুলি পরিচালনা করে না।
টিমম্ম

11

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

select concat('drop table if exists ', table_name, ' cascade;')
  from information_schema.tables;

তারপরে উত্পন্ন উত্সগুলি চালাও। তারা বর্তমান ডাটাবেসে প্রতিটি একক টেবিল ফেলে দেবে।

drop tableকমান্ডের জন্য এখানে কিছু সহায়তা দেওয়া হল ।


উপরের উত্তরটি ধরে নিয়েছে যে ||কনকনেটেশন অপারেটর হিসাবে সেট করা আছে। আরও নির্দিষ্টভাবে, মাইএসকিউএল এসকিউএল মোডে রয়েছে PIPES_AS_CONCAT। তথ্যসূত্র: dev.mysql.com/doc/refman/5.0/en/…
জি স্টান

@ আইনুট: শীতল! যে ইশারা জন্য ধন্যবাদ. concatপরিবর্তে কোডের নমুনাটি ব্যবহারের জন্য স্থির করে||
পাবলো সান্তা ক্রুজ

9

অনেকগুলি টেবিলের সাহায্যে আরও সহজ করে তুলতে আমি ডায়ন ট্রুরের উত্তরে এই পরিবর্তনটি নিয়ে এসেছি:

SET GROUP_CONCAT_MAX_LEN = 10000000;
SELECT CONCAT('SET FOREIGN_KEY_CHECKS=0;\n', 
              GROUP_CONCAT(CONCAT('DROP TABLE IF EXISTS `', table_name, '`')
                           SEPARATOR ';\n'),
              ';\nSET FOREIGN_KEY_CHECKS=1;')
FROM information_schema.tables
WHERE table_schema = 'SchemaName';

এটি পুরো ক্ষেত্রে এক ক্ষেত্রে ফিরিয়ে দেয়, তাই আপনি একবারে অনুলিপি করতে পারেন এবং সমস্ত টেবিল মুছে ফেলতে পারেন ( Copy Field Content (unquoted)ওয়ার্কবেঞ্চে ব্যবহার করুন )। আপনার যদি প্রচুর টেবিল থাকে তবে আপনি কিছু সীমাতে আঘাত করতে পারেন GROUP_CONCAT()। যদি তা হয় তবে সর্বাধিক লেন ভেরিয়েবল বৃদ্ধি করুন (এবং max_allowed_packet, প্রয়োজনে)।


SET GROUP_CONCAT_MAX_LEN আমার প্রয়োজনীয় কৌশলটি ছিল। আমার কাছে একটি স্ক্রিপ্ট ছিল যা কাজ করছিল, তবে কিছু ছাঁটাই টেবিলের নাম দিয়ে সর্বদা প্রথমবার ব্যর্থ হয়েছিল এবং দ্বিতীয়বার চালানোর পরে সফলভাবে শেষ হয়েছিল। ধন্যবাদ!
দ্বৈতমন

8

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

DROP PROCEDURE IF EXISTS `drop_all_tables`;

DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
    DECLARE _done INT DEFAULT FALSE;
    DECLARE _tableName VARCHAR(255);
    DECLARE _cursor CURSOR FOR
        SELECT table_name
        FROM information_schema.TABLES
        WHERE table_schema = SCHEMA();
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;

    SET FOREIGN_KEY_CHECKS = 0;

    OPEN _cursor;

    REPEAT FETCH _cursor INTO _tableName;

    IF NOT _done THEN
        SET @stmt_sql1 = CONCAT('DROP TABLE IF EXISTS ', _tableName);
        SET @stmt_sql2 = CONCAT('DROP VIEW IF EXISTS ', _tableName);

        PREPARE stmt1 FROM @stmt_sql1;
        PREPARE stmt2 FROM @stmt_sql2;

        EXECUTE stmt1;
        EXECUTE stmt2;

        DEALLOCATE PREPARE stmt1;
        DEALLOCATE PREPARE stmt2;
    END IF;

    UNTIL _done END REPEAT;

    CLOSE _cursor;
    SET FOREIGN_KEY_CHECKS = 1;
END$$

DELIMITER ;

call drop_all_tables();

DROP PROCEDURE IF EXISTS `drop_all_tables`;

7

প্রদত্ত ডাটাবেস থেকে সমস্ত টেবিল ফেলে দেওয়ার জন্য একটি লাইনার:

echo "DATABASE_NAME"| xargs -I{} sh -c "mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}"

এটি চালানো ডেটাবেস DATABASE_NAME থেকে সমস্ত সারণী বাদ দেবে।

এবং এই সম্পর্কে একটি দুর্দান্ত জিনিস হ'ল ডাটাবেস নামটি কেবল একবার স্পষ্টভাবে লেখা হয়।


1
এটি আমার পক্ষে কাজ করেছে তবে, আমাকে ম্যাকস হাই সিয়েরা -আর সাথে প্রতিস্থাপন করতে হয়েছিল
আলী সেলকুক

1
ধন্যবাদ @ অ্যালিসেলকুক। -আই এবং -আমি উভয়ই উবুন্টুতে আমার জন্য কাজ করি, সুতরাং এটিও ম্যাকস-এর জন্য কাজ করার জন্য আমি এটিকে -I তে পরিবর্তন করব।
মির্জেন

1
খুব দরকারী, আপনাকে ধন্যবাদ! মাইএসকিএল দুটি কমান্ডেই আমাকে -pPASSWORD (-p এবং PASSWORD এর মধ্যে কোনও স্থান নেই) ব্যবহার করে একটি পাসওয়ার্ড দিতে হয়েছিল
মাইক

6

এখানে বাশ স্ক্রিপ্টের মাধ্যমে এটি করার একটি স্বয়ংক্রিয় উপায়:

host=$1
dbName=$2
user=$3
password=$4

if [ -z "$1" ]
then
    host="localhost"
fi

# drop all the tables in the database
for i in `mysql -h$host -u$user -p$password $dbName -e "show tables" | grep -v Tables_in` ; do  echo $i && mysql -h$host -u$user -p$password $dbName -e "SET FOREIGN_KEY_CHECKS = 0; drop table $i ; SET FOREIGN_KEY_CHECKS = 1" ; done

সত্যই এই সমাধানটি পছন্দ করে তবে হোস্ট ভেরিয়েবলটি কীভাবে ব্যবহৃত হয় তা আমি দেখতে পাই না। এটি লুপের জন্য কোনও মাইএসকিএল কলটিতে ব্যবহৃত হবে বলে মনে হচ্ছে না।
ম্যাথু জ্যাকসচিউস্কি

1
দুঃখিত, এটি কমান্ডের মধ্যে রাখা মিস করেছেন, এটি আপডেট করেছেন।
কেফক্স

5

যদি লিনাক্সে (বা অন্য কোনও সিস্টেম যা পাইপিং, প্রতিধ্বনি এবং গ্রেপ সমর্থন করে) আপনি এটি একটি লাইনের সাহায্যে করতে পারেন:

echo "SET FOREIGN_KEY_CHECKS = 0;" > temp.txt; \
mysqldump -u[USER] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP >> temp.txt; \
echo "SET FOREIGN_KEY_CHECKS = 1;" >> temp.txt; \
mysql -u[USER] -p[PASSWORD] [DATABASE] < temp.txt;

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি মনে করি এই পদ্ধতিটি দ্রুত এবং সহজ।


2

পিএইচপি তে এর মতো সহজ:

$pdo = new PDO('mysql:dbname=YOURDB', 'root', 'root');

$pdo->exec('SET FOREIGN_KEY_CHECKS = 0');

$query = "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
          FROM information_schema.tables
          WHERE table_schema = 'YOURDB'";

foreach($pdo->query($query) as $row) {
    $pdo->exec($row[0]);
}

$pdo->exec('SET FOREIGN_KEY_CHECKS = 1');

আপনার ডাটাবেসের নামে এবং আপনার স্পষ্টতই ব্যবহারকারী / পাসের পরিবর্তে YOURDB পরিবর্তন করতে ভুলবেন না।


2

লিনাক্স শেলের মতো বাশ / জেডএস:

DATABASE_TO_EMPTY="your_db_name";
{ echo "SET FOREIGN_KEY_CHECKS = 0;" ; \
  mysql "$DATABASE_TO_EMPTY" --skip-column-names -e \
  "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') \
   FROM information_schema.tables WHERE table_schema = '$DATABASE_TO_EMPTY';";\
  } | mysql "$DATABASE_TO_EMPTY"

এটি কমান্ড তৈরি করবে, তারপরে তাত্ক্ষণিকভাবে তাদের দ্বিতীয় ক্লায়েন্টের উদাহরণে পাইপ করবে যা টেবিলগুলি মুছবে।

চালাক বিট অবশ্যই এখানে অন্যান্য উত্তর থেকে কপি করা হয় - আমি শুধু একটি কপি-এবং-pasteable এক-লাইনের (পর) প্রকৃতপক্ষে চেয়েছিলেন না কাজ ওপি চেয়েছিলেন।

অবশ্যই মনে রাখবেন যে আপনার খুব কম সুরক্ষা সেটআপ না থাকলে আপনার এই শংসাপত্রগুলি এই মাইএসকিএল কমান্ডগুলিতে (দুবার) রাখতে হবে। (বা আপনার ক্রেডিটগুলি অন্তর্ভুক্ত করার জন্য আপনি আপনার মাইএসকিএল কমান্ডের নাম রাখতে পারেন))


2

সমস্ত টেবিলে ফেলে দেওয়ার জন্য জোনাথন ওয়াট দ্বারা কিছু দরকারী মন্তব্য এখানে রেখেছি

MYSQL="mysql -h HOST -u USERNAME -pPASSWORD DB_NAME"
$MYSQL -BNe "show tables" | awk '{print "set foreign_key_checks=0; drop table `" $1 "`;"}' | $MYSQL
unset MYSQL

এটি আমাকে সহায়তা করে এবং আমি আশা করি এটি কার্যকর হতে পারে


2

কমান্ড লাইন থেকে একক লাইন দিয়ে ডাটাবেস থেকে সমস্ত সারণী ফেলে দিন:

mysqldump -u [user_name] -p[password] -h [host_name] --add-drop-table --no-data [database_name] | grep ^DROP | mysql -u [user_name] -p[password] -h [host_name] [database_name]

যেখানে [ব্যবহারকারীর নাম], [পাসওয়ার্ড], [হোস্ট_নাম] এবং [ডাটাবেস_নাম] একটি আসল ডেটা (ব্যবহারকারী, পাসওয়ার্ড, হোস্টের নাম, ডাটাবেসের নাম) দিয়ে প্রতিস্থাপন করতে হবে।


1

এটি একটি সুন্দর পুরাতন পোস্ট, তবে এখানে উত্তরগুলির কোনও উত্তরই আমার মতে প্রশ্নের উত্তরটি দেয় না, তাই আমি আশা করি আমার পোস্টটি মানুষকে সহায়তা করবে!

আমি অন্য একটি প্রশ্নের সমাধান পেয়েছি যা আমার পক্ষে সত্যিই ভাল কাজ করে:

mysql -Nse 'show tables' DB_NAME | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; truncate table \`$table\`" DB_NAME; done

এটি আসলে আপনার সমস্ত সারণী ডাটাবেসে খালি করবে DB_NAMEএবং TRUNCATEকমান্ড লাইনটি প্রদর্শন করবে না ।

আশাকরি এটা সাহায্য করবে!


দরকারী তবে এটি আসলে প্রশ্নের উত্তর দেয় না।
জ্রোসেল

1

@ ডিওন ট্রুটার এবং @ ওয়েড উইলিয়ামসের উত্তরের ভিত্তিতে, নিম্নলিখিত শেল স্ক্রিপ্টটি সমস্ত টেবিলগুলি ফেলে রাখবে, প্রথমে এটি কী চলছে তা দেখানোর পরে এবং আপনাকে সিটিআরএল-সি ব্যবহার বন্ধ করে দেওয়ার সুযোগ দেবে।

#!/bin/bash

DB_HOST=xxx
DB_USERNAME=xxx
DB_PASSWORD=xxx
DB_NAME=xxx

CMD="mysql -sN -h ${DB_HOST} -u ${DB_USERNAME} -p${DB_PASSWORD} ${DB_NAME}"

# Generate the drop statements
TMPFILE=/tmp/drop-${RANDOM}.sql
echo 'SET FOREIGN_KEY_CHECKS = 0;' > ${TMPFILE}
${CMD} $@ >> ${TMPFILE} << ENDD
    SELECT concat('DROP TABLE IF EXISTS \`', table_name, '\`;')
    FROM information_schema.tables
    WHERE table_schema = '${DB_NAME}';
ENDD
echo 'SET FOREIGN_KEY_CHECKS = 1;' >> ${TMPFILE}

# Warn what we are about to do
echo
cat ${TMPFILE}
echo
echo "Press ENTER to proceed (or Ctrl-C to abort)."
read

# Run the SQL
echo "Dropping tables..."
${CMD} $@ < ${TMPFILE}
echo "Exit status is ${?}."
rm ${TMPFILE}

0

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

echo "SET FOREIGN_KEY_CHECKS = 0;" > ./drop_all_tables.sql
mysqldump --add-drop-table --no-data -u user -p dbname | grep 'DROP TABLE' >> ./drop_all_tables.sql
echo "SET FOREIGN_KEY_CHECKS = 1;" >> ./drop_all_tables.sql
mysql -u user -p dbname < ./drop_all_tables.sql


0

সহজ এবং পরিষ্কার (হতে পারে)।

অভিনব সমাধান নাও হতে পারে তবে এটি আমার কাজ করে এবং আমার দিনকে বাঁচায়।

সার্ভার সংস্করণে কাজ করেছেন: 5.6.38 মাইএসকিউএল কমিউনিটি সার্ভার (জিপিএল)

পদক্ষেপগুলি আমি অনুসরণ করেছি:

 1. generate drop query using concat and group_concat.
 2. use database
 3. disable key constraint check
 4. copy the query generated from step 1
 5. enable key constraint check
 6. run show table

মাইএসকিউএল শেল

mysql> SYSTEM CLEAR;
mysql> SELECT CONCAT('DROP TABLE IF EXISTS `', GROUP_CONCAT(table_name SEPARATOR '`, `'), '`;') AS dropquery FROM information_schema.tables WHERE table_schema = 'emall_duplicate';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dropquery                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`; |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> USE emall_duplicate;
Database changed
mysql> SET FOREIGN_KEY_CHECKS = 0;                                                                                                                                                   Query OK, 0 rows affected (0.00 sec)

// copy and paste generated query from step 1
mysql> DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`;
Query OK, 0 rows affected (0.18 sec)

mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW tables;
Empty set (0.01 sec)

mysql> 

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


-1

আমি এমএসএসকিউএল সার্ভারের সাহায্যে নিম্নলিখিতটি ব্যবহার করি:

if (DB_NAME() = 'YOUR_DATABASE') 
begin
    while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
    begin
         declare @sql nvarchar(2000)
         SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
         FROM information_schema.table_constraints
         WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
         exec (@sql)
         PRINT @sql
    end

    while(exists(select 1 from INFORMATION_SCHEMA.TABLES))
    begin
         declare @sql2 nvarchar(2000)
         SELECT TOP 1 @sql2=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
         FROM INFORMATION_SCHEMA.TABLES
        exec (@sql2)
        PRINT @sql2
    end
end
else
    print('Only run this script on the development server!!!!')

আপনার ডাটাবেসের নামের সাথে YOUR_DATABASE প্রতিস্থাপন করুন বা পুরো আইএফ স্টেটমেন্টটি মুছে ফেলুন (আমি যুক্ত করা সুরক্ষা পছন্দ করি)।


-7

সবচেয়ে ভালো সমাধানআমার পক্ষে এখন পর্যন্ত

ডাটাবেস নির্বাচন করুন -> রাইট ক্লিক -> টাস্ক -> স্ক্রিপ্ট তৈরি করুন - স্ক্রিপ্ট তৈরি করার জন্য উইজার্ড খুলবে open সেট স্ক্রিপ্টিং বিকল্পে বস্তু চয়ন করার পরে অ্যাডভান্সড বাটন ক্লিক করুন । অধীনে "স্ক্রিপ্ট ড্রপ এবং তৈরি করুন" নির্বাচন স্ক্রিপ্ট ড্রপ

স্ক্রিপ্ট চালান।


এটি প্রায় কাজ করেছে তবে আমি নীল বোতামের আগে সবুজ বোতামটি ক্লিক করেছি এবং আমি একটি বাকী বাম দিকে পেয়েছিলাম এবং আমি বাতিল ক্লিক করেছিলাম তবে তারপরে আমি আমার কফি পান করে ভুলে গিয়েছিলাম।
রলফ

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