2010-09-20 19 views
14

Wiem, jak skopiować tabelę przy użyciu create new_table like old_table, ale to nie kopiuje również przez ograniczenia klucza obcego. Mogę również wykonać manipulację ciągami na wyniku z show create table old_table (używając wyrażeń regularnych, aby zastąpić nazwę tabeli i nazwy ograniczeń klucza obcego), ale wydaje się to być podatne na błędy. Czy istnieje lepszy sposób na skopiowanie struktury tabeli, w tym kluczy obcych?mysql: Kopiuj strukturę tabeli, w tym klucze obce

+2

Czy zdołałeś kiedyś to zrobić? Próbuję to rozgryźć, ale nie mogę tego uruchomić. –

+1

To smutne, że CREATE TABLE LIKE tworzy 95% tabel out ... Ja [pisałem o moich ostatecznych rozwiązaniach do duplikowania db] (https://medium.com/@igorsantos07/a-not-so-small-rant- on-mysql-based-techniques-to-copy-database-structures-4333f8ff8384 # .8qiega4cq), jeśli jest to przydatne dla każdego. Przykleiłem kilka powiązanych kwestii, takich jak te przedstawione w tym pytaniu. – igorsantos07

Odpowiedz

5

Ewentualnie można napisać procedurę, która po create table like przygotowuje ALTER TABLE ... oświadczenia, na podstawie informacji z:

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

Jeśli trochę side-scripting jest OK, można skorzystać z SHOW CREATE TABLE w kilku liniach, takich jak więc (PHP, ale koncepcja działa w dowolnym języku):

// 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> 

Niezbyt elegancki, ale działa do tej pory. Robię to w środowisku testowym, więc umieściłem to w mojej metodzie setUp().

+0

To jest najlepsze podejście, jeśli masz do czynienia z operacją skryptową. To smutne, że CREATE TABLE LIKE ma 95% kompletności. Ja [pisałem o moich ostatecznych rozwiązaniach do kopiowania db] (https://medium.com/@igorsantos07/a-not-so-small-rant-on-mysql-based-techniques-to-copy-database-structures- 4333f8ff8384 # .8qiega4cq), jeśli jest to przydatne dla każdego. Przykleiłem kilka powiązanych kwestii, takich jak te przedstawione w tym pytaniu. – igorsantos07

2

Odpowiedź Wrikken była dla mnie inspiracją. Pozwól mi to rozszerzyć.

Cóż, sprawy są bardziej skomplikowane. Patrz: http://dev.mysql.com/doc/refman/5.1/en/create-table.html. Mówi, że pojawią się również problemy z tabelami TEMPORARY i innymi rzeczami. Rozwiązanie wspomniał Wrikken jest dobrym podejściem, jednak trzeba będzie przynajmniej jeden więcej odnośnika aby uzyskać informacje o UPDATE i DELETE zasad:

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

Tak, to może być dobry pomysł, aby uzyskać narzędzie, które upraszcza zadanie. Osobiście używam Adminera (https://sourceforge.net/projects/adminer/). Jest wyposażony w opcję eksportu całego DB (ze wszystkimi tabelami, wyzwalaczami, kluczami obcymi, ...). Po wyeksportowaniu (w składni SQL) można łatwo zmienić nazwę bazy danych i zaimportować ją ponownie. Pisałem o tym w dziale błędów projektu (patrz bilet 380).

Może już masz swojego ulubionego menedżera DB i nie chcesz innego. Można wykonać następujące kroki następnie:

  1. Dump DB korzystając mysqldump -> masz file.sql
  2. Utwórz nowy DB
  3. Execute file.sql w nowym DB

Zarówno Adminer i mysqldump mieć opcja wyboru tylko określonych tabel, dzięki czemu nie trzeba eksportować całego DB. Jeśli potrzebujesz tylko struktury, a nie danych, użyj opcji -d dla mysqldump lub kliknij ją w Adminer.

0

Jeśli masz phpMyAdmina, możesz wyeksportować tylko strukturę tabeli, a następnie zmienić stare nazwy tabel na nowe w pliku .sql i zaimportować je z powrotem.

To dość szybki sposób

-2

Jeśli chcesz tylko do czyszczenia stołu, można skopiować wszystkie istotne dane do tabeli kopii. Następnie skróć i skopiuj z powrotem. Rezultat jest taki, że masz zachowany swój FK.

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; 
Powiązane problemy