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
Odpowiedz
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;
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()
.
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
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:
- Dump DB korzystając
mysqldump
-> maszfile.sql
- Utwórz nowy DB
- 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
.
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
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;
- 1. MySQL Error 150 - klucze obce
- 2. MySQL znaleźć nieprawidłowe klucze obce
- 3. Zrzuć wszystkie klucze obce w bazie danych MySQL
- 4. klucze podstawowe/obce w uml
- 5. Jak działają klucze obce?
- 6. Znikające klucze obce w phpMyAdmin
- 7. Laravel + zerowe klucze obce
- 8. Django - klucze obce w urządzeniach
- 9. Klucze obce JSON w PostgreSQL
- 10. Klucze obce z Sequelize nie są tworzone
- 11. Zapytanie, aby znaleźć klucze obce
- 12. Wielokrotne klucze obce SQL jako klucze główne
- 13. Jak skryptować indeksy, klucze, klucze obce w SQL Server
- 14. Klucze obce w wydaniu migracji Laravel 4
- 15. Skrypt SQL, aby znaleźć klucze obce do określonej tabeli?
- 16. Non-primary klucze obce w Django
- 17. Ebean - Podstawowy klucz złożony zawierający klucze obce
- 18. SQL: Wstaw dane z innej tabeli w tabeli, która zawiera klucze obce
- 19. Dwa klucze obce odnoszące się do tego samego klucza podstawowego
- 20. Czy mogę tworzyć klucze obce w bazach danych?
- 21. Klucze obce języka Laravel 5.1 w modelu fabryki
- 22. Klucze obce w postgresql mogą zostać naruszone przez wyzwalacz
- 23. Pokaż strukturę tabeli w SQL
- 24. Klucze wyłączania i włączania MySQL
- 25. Skopiuj strukturę tabeli do nowej tabeli
- 26. Laravel4 duplikat/kopiuj wiersz tabeli
- 27. Tłumaczenie połączeń SQL na klucze obce na składnię R data.table
- 28. Jak znaleźć niezindeksowane klucze obce w SQL Server
- 29. jsonb i klucze podstawowe/obce: które działa lepiej w PostgreSQL?
- 30. Dwa klucze obce i wartość w szablonie django
Czy zdołałeś kiedyś to zrobić? Próbuję to rozgryźć, ale nie mogę tego uruchomić. –
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