Tabel kopiëren (MySQL)

Uit De Vliegende Brigade
Versie door Jeroen Strompf (overleg | bijdragen) op 1 okt 2019 om 17:47 (Jeroen Strompf heeft pagina Tabel kopiëren naar een andere database (MySQL) hernoemd naar Tabel kopiëren (MySQL))
(wijz) ← Oudere versie | Huidige versie (wijz) | Nieuwere versie → (wijz)
Naar navigatie springen Naar zoeken springen

Regelmatig wil ik tabellen kopiëren van de ene tabel naar de andere. Bv. als ik met een datawarehouse werk, dat uit drie losse databases bestaat (org, op & export). Hoe doe je dat?

Het probleem

Kopiëren van de inhoud is triviaal. Het probleem betreft de overige kenmerken van zo'n tabel:

  • PK
  • Indexes
  • Foreign keys? - Hier heb ik nog geen ervaring mee.

Command line

Via de command line kan dit met één commando:

mysqldump bron_db_naam tabel_naam | mysql doel_db_naam

Voordelen:

  • Kenmerken zoals pk en indexes worden meegenomen
  • Kort statement.

Nadelen:

  • Meestal zoek ik een oplossing in SQL. Hetzelfde geldt voor oplossingen mbv. PHPMyAdmin: Die schijnt dit truukje heel goed te kunnen, maar dat is niet wat ik zoek.

SQL - Create + select

Wat ik tot voor kort gebruikte (sep. 2019):

drop table if exists abc;
create table abc
select * from other_db.abc;

Maar dan komen PK's en indexes niet mee. NN (velden die niet nul mogen zijn), komen wel mee (getest: okt. 2019).

SQL - create like + select

Vermoedelijk de oplossing:

  • Dankzij deze post (okt. 2019)
  • Alleen worden foreign constrains niet meegenomen - heb ik tot op heden nog niet mee te maken gehad):
CREATE DEFINER=`root`@`localhost` PROCEDURE `fetch_table_from_import`
(
   in   source_table_in		tinytext,
   in	destination_table_in	tinytext
)
BEGIN
# 
# Fetch table (structure + content) from database "bal_dwh_import" to current database
###############################################################################################################
#
# * NOTE: Current destination table is being dropped (without backup)
# * The name of the source-database is hardcoded: "BAL_DWH_IMPORT"
# * Current database is used as destination-database


###############################################################################################################
# Drop existing destination table
###############################################################################################################
#
set @ddl=concat("drop table if exists ",destination_table_in);

prepare stmt from @ddl;
execute stmt;
deallocate prepare stmt;


###############################################################################################################
# Instantiate new table (structure)
###############################################################################################################
#
set @ddl=concat
(
   "create table ", destination_table_in, " ",
   "like bal_dwh_import.",source_table_in
);

prepare stmt from @ddl;
execute stmt;
deallocate prepare stmt;


###############################################################################################################
# Insert content
###############################################################################################################
#
set @ddl=concat
(
   "insert into ", destination_table_in, " ",
   "select * from bal_dwh_import.", source_table_in
);

prepare stmt from @ddl;
execute stmt;
deallocate prepare stmt;

END

SQL - Geavanceerd

Nog twee aanvullende oplossingen, die beiden aanvullende SQL-code in de sproc vereisen:

  • Analyseer de brontabel tav. PK's en indexes. Pas dat vervolgens toe op de brontabel
  • Gebruik hiervoor maatwerk-code per tabel. Niet zo ver gezocht in mijn situatie, want de bron-database is de SSoT voor een dwh.

Zie ook

Bronnen