2010-09-20 18 views
14

मुझे पता है कि create new_table like old_table का उपयोग कर एक मेज कॉपी करने के लिए सहित कॉपी तालिका संरचना है, लेकिन है कि विदेशी कुंजी की कमी पर कॉपी नहीं करता है और साथ ही। मैं show create table old_table (तालिका नाम और विदेशी कुंजी बाधा नामों को बदलने के लिए नियमित अभिव्यक्तियों का उपयोग करके) पर स्ट्रिंग मैनिपुलेशन भी कर सकता हूं, लेकिन ऐसा लगता है कि त्रुटि प्रवण होती है। क्या विदेशी कुंजी सहित तालिका की संरचना की प्रतिलिपि बनाने का कोई बेहतर तरीका है?mysql: विदेशी कुंजी

+2

क्या आपने कभी ऐसा करने का प्रबंधन किया था? मैं अभी इसे समझने की कोशिश कर रहा हूं, लेकिन वास्तव में इसे काम नहीं कर सकता। –

+1

यह दुख की बात है कि तालिका बनाएं जैसे 9 5% टेबल तैयार करता है ... मैंने [डीबी को डुप्लिकेट करने के लिए अपने अंतिम समाधानों के बारे में लिखा] [https://medium.com/@igorsantos07/a-not-so-small-rant- ऑन-माइस्क्ल-आधारित-तकनीक-प्रति-प्रति-डेटाबेस-संरचनाएं -4333f8ff8384 # .8qiega4cq), अगर यह किसी के लिए उपयोगी है। मैंने इस सवाल में प्रस्तुत किए गए कई लिंक किए गए मुद्दों को एक साथ चिपकाया। – igorsantos07

उत्तर

5

संभवतः आप, एक प्रक्रिया है जो बाद create table likeALTER TABLE ... बयान तैयार करता है लिख सकता से जानकारी के आधार पर:

SELECT * 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME LIKE '<table_name>' 
AND TABLE_SCHEMA = '<db_name>' 
AND REFERENCED_TABLE_NAME IS NOT NULL; 
2

एक छोटे से पक्ष पटकथा ठीक है, तो आप की तरह एक कुछ पंक्तियों में SHOW CREATE TABLE का लाभ ले सकते इसलिए (PHP लेकिन अवधारणा किसी भी भाषा में काम करता है):

// Get the create statement 
$retrieve = "SHOW CREATE TABLE <yourtable>"; 

$create = <run the $retrieve statement> 

// Isolate the "Create Table" index 
$create = $create['Create Table']; 

// Replace old table name with new table name everywhere 
$create = preg_replace("/".$newname."/", $oldname, $create); 

// You may need to rename foreign keys to prevent name re-use error. 
// See http://stackoverflow.com/questions/12623651/ 
$create = preg_replace("/FK_/", "FK_TEMP_", $create);  

// Create the new table 
<run the $create statement> 
नहीं

बहुत ही सुंदर है, लेकिन यह अब तक काम करता है। मैं इसे एक परीक्षण वातावरण में कर रहा हूं इसलिए मैंने इसे अपने setUp() विधि में रखा।

+0

यदि आप एक स्क्रिप्टेड ऑपरेशन से निपट रहे हैं तो यह सबसे अच्छा तरीका है। यह दुख की बात है कि तालिका की तरह 95% पूर्ण है। मैंने [डीबी की प्रतिलिपि बनाने के लिए अपने अंतिम समाधानों के बारे में लिखा] (https://medium.com/@igorsantos07/a-not-so-small-rant-on-mysql-based-techniques-to-copy-डेटा- संरचनाएं- 4333f8ff8384 # .8qiega4cq), अगर यह किसी के लिए उपयोगी है। मैंने इस सवाल में प्रस्तुत किए गए कई लिंक किए गए मुद्दों को एक साथ चिपकाया। – igorsantos07

2

विक्रकेन के जवाब ने मुझे प्रेरित किया। मुझे इसे विस्तारित करने दें।

ठीक है, चीजें अधिक जटिल हैं। देखें: http://dev.mysql.com/doc/refman/5.1/en/create-table.html। यह कहता है कि TEMPORARY टेबल और अन्य चीजों के साथ भी समस्याएं होने जा रही हैं। समाधान Wrikken से उल्लेख किया है, एक अच्छा तरीका है हालांकि, आप जानकारी के बारे में UPDATE और DELETE नियम पाने के लिए कम से कम एक देखने की आवश्यकता होगी: एक अच्छा विचार तो, यह हो सकता है

SELECT * 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
WHERE TABLE_NAME LIKE '<table_name>' 
AND CONSTRAINT_SCHEMA = '<db_name>'; 

एक उपकरण है जो सरल पाने के लिए काम। मैं व्यक्तिगत रूप से व्यवस्थापक (https://sourceforge.net/projects/adminer/) का उपयोग करता हूं। यह पूरे डीबी निर्यात करने के विकल्प के साथ आता है (सभी तालिकाओं, ट्रिगर्स, विदेशी कुंजी, ...) के साथ। एक बार जब आप इसे निर्यात कर लें (एसक्यूएल सिंटैक्स में) आप आसानी से डीबी नाम बदल सकते हैं और इसे वापस आयात कर सकते हैं। मैंने इस परियोजना के बग अनुभाग में लिखा था (टिकट 380 देखें)।

हो सकता है कि आप पहले से ही अपने पसंदीदा डीबी प्रबंधक है और एक दूसरे से नहीं करना चाहती। इसके बाद आप इन चरणों का पालन कर सकते हैं:

  1. डंप डीबी mysqldump का उपयोग कर -> आप file.sql
  2. एक नया डीबी बनाएं
  3. नई डीबी में निष्पादित file.sql

दोनों Adminer और mysqldump है मिल केवल विशिष्ट सारणी चुनने का विकल्प ताकि आपको संपूर्ण डीबी निर्यात करने की आवश्यकता न हो। क्या आपको केवल संरचना की आवश्यकता है, डेटा नहीं, -dmysqldump के लिए विकल्प का उपयोग करें या इसे Adminer पर क्लिक करें।

0

यदि आपके पास phpMyAdmin है, तो आप अपनी तालिका की केवल संरचना निर्यात कर सकते हैं, फिर अपने .sql फ़ाइल में पुराने टेबल नामों को नए में बदल सकते हैं और इसे वापस आयात कर सकते हैं।

यह बल्कि त्वरित तरीका है

-2

तुम सिर्फ अपनी मेज साफ करने के लिए चाहते हैं, आप अपनी कॉपी मेज पर सभी संबंधित डेटा कॉपी कर सकते हैं। कटाई से और वापस कॉपी करें। नतीजा यह है कि आपके पास एफके संरक्षित है।

CREATE TABLE IF NOT EXISTS t_copy LIKE t_origin; 

INSERT INTO t_copy 
SELECT t_origin.*  
FROM t_origin; 


SET FOREIGN_KEY_CHECKS = 0; 

TRUNCATE t_origin; 

INSERT INTO t_origin 
SELECT t_copy.* 
FROM t_copy; 

DROP TABLE t_copy; 

SET FOREIGN_KEY_CHECKS = 1; 
संबंधित मुद्दे