{"id":55001207,"date":"2019-10-01T00:00:00","date_gmt":"2020-05-13T20:56:39","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1207"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Kopier_und_Loeschreihenfolge_in_MySQL","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/","title":{"rendered":"Kopier- und L&ouml;schreihenfolge in MySQL"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg06.met.vgwort.de\/na\/283ca2e7b41b44c584423be5c21dd4eb\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im Beitrag &#8222;Kopier- und L&ouml;schreihenfolge f&uuml;r Tabellen&#8220; (www.access-im-unternehmen.de\/926) haben wir ermittelt, wie wir die richtige Reihenfolge f&uuml;r das L&ouml;schen von Tabellen und das Kopieren von Tabelleninhalten von einer Datenbank in die n&auml;chste ermitteln. Wenn Sie die Reihenfolge nicht beachten, kann es n&auml;mlich sein, dass Datens&auml;tze wegen Fremdschl&uuml;sselverletzungen nicht gel&ouml;scht und auch nicht kopiert werden k&ouml;nnen. Im vorliegenden Beitrag zeigen wir, wie Sie die vorgestellte L&ouml;sung f&uuml;r das L&ouml;schen und Kopieren von Tabellen in MySQL-Datenbanken nutzen k&ouml;nnen.<\/b><\/p>\n<p>In oben genanntem Beitrag haben wir bereits erl&auml;utert, in welcher Reihenfolge die Tabellen gel&ouml;scht und deren Daten kopiert werden m&uuml;ssen, damit dies ohne Fehlermeldungen durch Restriktionen m&ouml;glich ist. Wir fassen das noch einmal zusammen: Wenn Sie etwa nur die beiden Tabellen <b>tblKunden <\/b>und <b>tblAnreden <\/b>verwenden, bei denen die Tabelle &uuml;ber das Fremdschl&uuml;sselfeld <b>AnredeID <\/b>mit dem Feld <b>AnredeID <\/b>der Tabelle <b>tblAnreden <\/b>verkn&uuml;pft ist, gelten folgende Regeln:<\/p>\n<ul>\n<li>Beim L&ouml;schen der enthaltenen Datens&auml;tze m&uuml;ssen erst die Datens&auml;tze gel&ouml;scht werden, die in der Tabelle mit dem Fremdschl&uuml;sselfeld der Beziehung enthalten sind. Wir l&ouml;schen also zun&auml;chst die Datens&auml;tze der Tabelle <b>tblKunden <\/b>und erst dann die Datens&auml;tze der Tabelle <b>tblAnreden<\/b>.<\/li>\n<li>Beim Kopieren der Daten von Tabellen einer Datenbank in die Tabellen der anderen Datenbank m&uuml;ssen erst die Datens&auml;tze der Tabelle mit dem Prim&auml;rschl&uuml;sselfeld der Beziehung kopiert werden und dann die der anderen Tabelle. Wir kopieren also erst die Datens&auml;tze der Tabelle <b>tblAnreden <\/b>und erst dann die der Tabelle <b>tblKunden<\/b>.<\/li>\n<\/ul>\n<p>Auf die gleiche Weise k&ouml;nnen Sie bei komplexeren Datenmodellen vorgehen. Um das zu automatisieren, sucht man sich zum L&ouml;schen der Daten zun&auml;chst die Tabellen heraus, auf die keine andere Tabelle per Fremdschl&uuml;sselfeld verweist. Im zweiten Schritt ermitteln wir alle Tabellen, die nicht bereits ermittelt wurden und auf die keine andere der noch &uuml;brigen Tabellen per Fremdschl&uuml;sselfeld verweist und so weiter.<\/p>\n<p>Beim Kopieren von Daten suchen wir im ersten Schritt zuerst die Tabellen heraus, die nicht per Fremdschl&uuml;sselfeld auf andere Tabellen verweisen. Dann suchen wir im zweiten Schritt die Tabellen heraus, die per Fremdschl&uuml;sselfeld nur auf die im ersten Schritt ermittelten Tabellen verweisen und so weiter.<\/p>\n<h2>Reihenfolge per VBA bestimmen<\/h2>\n<p>Im weiter oben erw&auml;hnten Beitrag haben wir bereits einen Algorithmus definiert, mit dem wir die Reihenfolge der Tabellen beim L&ouml;schen und beim Kopieren der Daten der Tabellen ermitteln. Dabei haben wir die Elemente der DAO-<b>TableDefs<\/b>-Auflistung durchlaufen und f&uuml;r die Informationen bez&uuml;glich der Beziehungen die Daten der Relations-Auflistung genutzt.<\/p>\n<p>Unter MySQL stehen uns diese Elemente nicht zur Verf&uuml;gung. Wenn Sie zwei miteinander in Beziehung stehende und per ODBC eingebundene MySQL-Tabellen in das Beziehungen-Fenster ziehen, sehen Sie bereits, dass die f&uuml;r diese Tabellen definierte Beziehung nicht in Access verf&uuml;gbar ist (siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2019_05\/pic_1207_001.png\" alt=\"Keine Beziehungen von ODBC-verkn&uuml;pften Tabellen sichtbar\" width=\"424,7115\" height=\"251,7567\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Keine Beziehungen von ODBC-verkn&uuml;pften Tabellen sichtbar<\/span><\/b><\/p>\n<h2>Alle Tabellen einbinden<\/h2>\n<p>Hier stehen wir am Scheideweg, denn nun gibt es zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Sie f&uuml;gen alle per ODBC eingebundenen Tabellen zum <b>Beziehungen<\/b>-Fenster hinzu und f&uuml;gen die Beziehungen manuell ein. Das ist allerdings je nach Anzahl der Tabellen eine Flei&szlig;arbeit, die &#8211; wie bei solchen Arbeiten &uuml;blich &#8211; mit einer Fehleranf&auml;lligkeit ausgestattet ist. Danach k&ouml;nnen Sie die Reihenfolge der Tabelle zum L&ouml;schen und Kopieren mit den bereits vorgestellten Prozeduren ermitteln.<\/li>\n<li>Sie schreiben eine Prozedur, die alle Tabellen der Datenbank unter MySQL hinsichtlich der Beziehungen untersucht und diese automatisiert zu den per ODBC eingebundenen Tabellen hinzuf&uuml;gt. Danach k&ouml;nnen Sie die Reihenfolge der Tabelle zum L&ouml;schen und Kopieren ebenfalls mit den bereits vorgestellten Prozeduren ermitteln.<\/li>\n<li>Oder wir passen die vorhandenen Prozeduren so an, dass wir per ADO direkt auf die Informationen &uuml;ber die Beziehungen zwischen den Tabellen zugreifen. Hierzu m&uuml;ssten wir noch herausfinden, wie wir auf die gew&uuml;nschten Informationen zugreifen. Da wir hierbei etwas Neues lernen, entscheiden wir uns an dieser Stelle f&uuml;r diese Option.<\/li>\n<\/ul>\n<h2>Tabellen durchlaufen<\/h2>\n<p>Das Durchlaufen der Tabellen erfolgt nicht &uuml;ber eine Auflistung wie <b>TableDefs<\/b>, sondern wir nutzen die Anweisung <b>SHOW TABLES<\/b>, mit der wir wie mit einer <b>SELECT<\/b>-Anweisung auf die Daten der MySQL-Datenbank zugreifen. <b>Show Tables <\/b>liefert uns ebenfalls ein Ergebnis in Form eines Recordsets zur&uuml;ck. In den folgenden Codezeilen nutzen wir eine Hilfsfunktion namens <b>GetRecordset<\/b>, deren ersten Parameter wir mit einer Konstanten f&uuml;llen, welche die Verbindungszeichenfolge zu der gew&uuml;nschten Datenbank enth&auml;lt:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>rstTabellen<span style=\"color:blue;\"> As <\/span>ADODB.Recordset\r\n<span style=\"color:blue;\">Set<\/span> rstTabellen = GetRecordset(GetConnection( cStrVerbindungszeichenfolgeAlt), \"SHOW TABLES\")\r\n<span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstTabellen.EOF\r\n     <span style=\"color:blue;\">Debug.Print<\/span> rstTabellen.Fields(0)\r\n     rstTabellen.Move<span style=\"color:blue;\">Next<\/span>\r\n<span style=\"color:blue;\">Loop<\/span><\/pre>\n<p>Hier f&uuml;llen wir so ein Recordset namens <b>rstTabellen <\/b>mit allen Eintr&auml;gen, die der Befehl <b>SHOW TABLES <\/b>zur&uuml;ckliefert und geben diese im Direktbereich des VBA-Fensters aus. F&uuml;r die verwendeten Hilfsfunktionen ben&ouml;tigen wir noch einen Verweis auf die Bibliothek <b>Microsoft ActiveX Data Objects x.y Library<\/b>, den Sie &uuml;ber den <b>Verweise<\/b>-Dialog hinzuf&uuml;gen (VBA-Editor, Men&uuml;eintrag <b>Extras|Verweise<\/b>).<\/p>\n<h2>Beziehungen ermitteln<\/h2>\n<p>Nun wollen wir wissen, ob eine Tabelle &uuml;ber ein Fremdschl&uuml;sselfeld mit einer anderen Tabelle verkn&uuml;pft ist oder ob eine Tabelle vom Fremdschl&uuml;sselfeld einer anderen Tabelle referenziert wird.<\/p>\n<p>Dazu verwenden wir testweise die Prozedur <b>Relationinfo<\/b> aus Listing 1. In dieser weisen wir der Variablen <b>strSQL <\/b>die folgende Abfrage zu:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Relationinfo()\r\n     <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>ADODB.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>fld<span style=\"color:blue;\"> As <\/span>ADODB.Field\r\n     strSQL = \"SELECT TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME \" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n         & \"FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE\" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n         & \"WHERE REFERENCED_TABLE_NAME IS NOT NULL;\"\r\n     <span style=\"color:blue;\">Set<\/span> rst = GetRecordset(GetConnection(cStrVerbindungszeichenfolgeAlt), strSQL)\r\n     For Each fld In rst.Fields\r\n         <span style=\"color:blue;\">Debug.Print<\/span> fld.Name,\r\n     <span style=\"color:blue;\">Next<\/span> fld\r\n     <span style=\"color:blue;\">Debug.Print<\/span>\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n         For Each fld In rst.Fields\r\n             <span style=\"color:blue;\">Debug.Print<\/span> fld.Value,\r\n         <span style=\"color:blue;\">Next<\/span> fld\r\n         <span style=\"color:blue;\">Debug.Print<\/span>\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Ermitteln aller Beziehungen mit beteiligten Tabellen und Feldern<\/span><\/b><\/p>\n<pre>SELECT TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME \r\nFROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE \r\nWHERE REFERENCED_TABLE_NAME IS NOT NULL;<\/pre>\n<p>Hier ermitteln wir die Felder mit den relevanten Informationen aus der Tabelle <b>INFORMATION_SCHEMA.KEY_COLUMN_USAGE<\/b> f&uuml;r die Bedingung <b>REFERENCED_TABLE_NAME IS NOT NULL<\/b>. Danach durchlaufen wir alle Felder der Tabelle und geben die Namen der Felder als Kopfzeile im Direktbereich des VBA-Editors aus und liefern direkt anschlie&szlig;end die Werte dieser Felder f&uuml;r alle gefundenen Datens&auml;tze.<\/p>\n<p>Das sieht dann etwa wie folgt aus:<\/p>\n<pre>TABLE_NAME    COLUMN_NAME   REFERENCED_TABLE_NAME       REFERENCED_COLUMN_NAME      \r\ns_order_basket_attributes   basketID      s_order_basket              id            \r\ns_core_auth_attributes      authID        s_core_auth   id            \r\ns_articles_attributes       articleID     s_articles    id <\/pre>\n<p>Damit kommen wir nun zumindest an alle Informationen heran, die wir theoretisch ben&ouml;tigen, um die Reihenfolge der Tabellen f&uuml;r das L&ouml;schen und das Kopieren zu bestimmen. Wir m&uuml;ssen die Informationen nur noch geschickt kombinieren, was wir in den folgenden Schritten erledigen werden.<\/p>\n<h2>Reihenfolge f&uuml;r das Kopieren ermitteln<\/h2>\n<p>Die Reihenfolge der Tabellen f&uuml;r das Kopieren der Daten ermitteln wir in der Funktion <b>TabellenreihenfolgeKopieren <\/b>aus Listing 2. In dieser Funktion, welche die zu verwendende Verbindungszeichenfolge als Parameter erwartet und die ein <b>Collection<\/b>-Objekt als Ergebnis zur&uuml;ckliefert, erstellen wir zwei Collections. Die erste hei&szlig;t <b>colOffen <\/b>und speichert alle Tabellen, die noch nicht in die Reihenfolge eingearbeitet wurden. Die zweite hei&szlig;t <b>colReihenfolge <\/b>und enth&auml;lt die Tabellen in der ermittelten Reihenfolge.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>TabellenreihenfolgeKopieren(strVerbindungszeichenfolge<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Dim <\/span>colOffen<span style=\"color:blue;\"> As <\/span>Collection, colReihenfolge<span style=\"color:blue;\"> As <\/span>Collection, bolIstDetailtabelle<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>varOffen<span style=\"color:blue;\"> As Variant<\/span>, varReihenfolge<span style=\"color:blue;\"> As Variant<\/span>, intCountVorher<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rstTabellen<span style=\"color:blue;\"> As <\/span>ADODB.Recordset, rstBeziehungen<span style=\"color:blue;\"> As <\/span>ADODB.Recordset, strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> colOffen = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Set<\/span> colReihenfolge = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Set<\/span> rstTabellen = GetRecordset(GetConnection(strVerbindungszeichenfolge), \"SHOW TABLES\")\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstTabellen.EOF\r\n         colOffen.Add rstTabellen.Fields(0).Value, rstTabellen.Fields(0).Value\r\n         rstTabellen.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     strSQL = \"SELECT TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME \" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n         & \"FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE\" & <span style=\"color:blue;\">vbCrLf<\/span> & \"WHERE REFERENCED_TABLE_NAME IS NOT NULL;\"\r\n     <span style=\"color:blue;\">Set<\/span> rstBeziehungen = GetRecordset(GetConnection(cStrVerbindungszeichenfolgeAlt), strSQL)\r\n     <span style=\"color:blue;\">Do While<\/span> colOffen.Count &gt; 0\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> intCountVorher = colOffen.Count<span style=\"color:blue;\"> Then<\/span>\r\n             intCountVorher = colOffen.Count\r\n             For Each varOffen In colOffen\r\n                 bolIstDetailtabelle = <span style=\"color:blue;\">False<\/span>\r\n                 rstBeziehungen.MoveFirst\r\n                 <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstBeziehungen.EOF\r\n                     <span style=\"color:blue;\">If <\/span>rstBeziehungen!TABLE_NAME = varOffen<span style=\"color:blue;\"> Then<\/span>\r\n                         bolIstDetailtabelle = <span style=\"color:blue;\">True<\/span>\r\n                         For Each varReihenfolge In colReihenfolge\r\n                             <span style=\"color:blue;\">If <\/span>rstBeziehungen!REFERENCED_TABLE_NAME = varReihenfolge<span style=\"color:blue;\"> Then<\/span>\r\n                                 bolIstDetailtabelle = <span style=\"color:blue;\">False<\/span>\r\n                                 <span style=\"color:blue;\">Exit For<\/span>\r\n                             <span style=\"color:blue;\">End If<\/span>\r\n                         <span style=\"color:blue;\">Next<\/span> varReihenfolge\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                     rstBeziehungen.Move<span style=\"color:blue;\">Next<\/span>\r\n                 <span style=\"color:blue;\">Loop<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>bolIstDetailtabelle = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n                     colReihenfolge.Add varOffen, varOffen\r\n                     colOffen.Remove varOffen\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 DoEvents\r\n             <span style=\"color:blue;\">Next<\/span> varOffen\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">Exit Do<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Anzahl offener Tabellen (da Zirkelbezug): \" & colOffen.Count & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n         & \"Die Tabellen werden an die Collection angeh&auml;ngt.\"\r\n     For Each varOffen In colOffen\r\n         colReihenfolge.Add varOffen, varOffen\r\n     <span style=\"color:blue;\">Next<\/span> varOffen\r\n     <span style=\"color:blue;\">Set<\/span> TabellenreihenfolgeKopieren = colReihenfolge\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Ermitteln der Reihenfolge f&uuml;r das Kopieren von Daten<\/span><\/b><\/p>\n<p>Um die Collection <b>colOffen <\/b>zu f&uuml;llen, erstellen wir ein Recordset namens <b>rstTabellen <\/b>auf Basis der Abfrage <b>SHOW TABLES<\/b>. Dieses durchlaufen wir und tragen den Namen der Tabelle f&uuml;r jeden Datensatz in die Collection <b>colOffen <\/b>ein.<\/p>\n<p>Dann verwenden wir die weiter oben vorgestellte SQL-Abfrage zum Ermitteln aller Beziehungen der Datenbank, um ein weiteres Recordset namens <b>rstBeziehungen <\/b>zu f&uuml;llen. <\/p>\n<p>Dann starten wir in eine <b>Do While<\/b>-Schleife, die solange l&auml;uft, bis die Anzahl der Eintr&auml;ge der Collection <b>colOffen <\/b>gleich <b>0 <\/b>ist. Innerhalb der <b>Do While<\/b>-Schleife gibt es als Erstes eine Bedingung, die pr&uuml;ft, ob die Anzahl der Eintr&auml;ge in <b>colOffen <\/b>nicht dem in der Variablen <b>intCountVorher <\/b>entspricht. Das ist beim ersten Durchlauf nicht der Fall, da <b>intCountVorher <\/b>noch nicht gef&uuml;llt wurde und somit den Wert <b>0 <\/b>enth&auml;lt.<\/p>\n<p>Da wir davon ausgehen, dass die MySQL-Datenbank immer mindestens eine Tabelle enth&auml;lt, werden die Anweisungen innerhalb der <b>If&#8230;Then<\/b>-Bedingung auch ausgef&uuml;hrt. Direkt danach stellen wir <b>intCountVorher <\/b>auf den aktuellen Wert von <b>colOffen <\/b>ein. Danach beginnen Anweisungen, die sukzessive Eintr&auml;ge von <b>colOffen <\/b>nach <b>colReihenfolge <\/b>verschieben sollen, sodass <b>colOffen.Count <\/b>mit jedem Schleifendurchlauf kleiner wird und erst dann mit <b>intCountVorher <\/b>&uuml;bereinstimmt, wenn innerhalb der Schleife keine Elemente mehr aus <b>colOffen <\/b>entnommen wurden.<\/p>\n<p>Das geschieht nur, wenn &uuml;ber die Beziehung zweier Tabellen ein Zirkelbezug hergestellt wurde. In diesem Fall sollen diese Tabellen zum Schluss an die Auflistung angeh&auml;ngt werden &#8211; mit einem entsprechenden Hinweis auf die Anzahl der Tabellen mit nicht auswertbaren Beziehungen.<\/p>\n<p>Innerhalb der Bedingung durchlaufen wir in einer <b>For Each<\/b>-Schleife alle Eintr&auml;ge von <b>colOffen<\/b>. Darin stellen wir die Variable <b>bolIstDetailtabelle <\/b>zun&auml;chst auf den Wert <b>False <\/b>ein, das hei&szlig;t, wir gehen davon aus, dass die Tabelle nicht die Detailtabelle einer Beziehung ist. Zur Erinnerung: die Detailtabelle ist die Tabelle mit dem an der Beziehung beteiligten Fremdschl&uuml;sselfeld, die Mastertabelle ist die Tabelle mit dem an der Beziehung beteiligten Prim&auml;rschl&uuml;sselfeld.<\/p>\n<p>Dann stellen wir den Datensatzzeiger des Recordsets <b>rstBeziehungen <\/b>auf den ersten Datensatz ein (<b>rstBeziehungen.MoveFirst<\/b>). In einer <b>Do While<\/b>-Schleife &uuml;ber alle Datens&auml;tze des Recordsets <b>rstBeziehungen <\/b>pr&uuml;fen wir nun, ob das Feld <b>TABLE_NAME<\/b> des aktuellen Datensatzes, welches der Tabelle mit dem Fremdschl&uuml;sselfeld (also der Detailtabelle) entspricht, mit der aktuellen Tabelle aus <b>colOffen <\/b>&uuml;bereinstimmt. Das bedeutet, dass die Tabelle offensichtlich als Detailtabelle an einer Beziehung beteiligt ist und wir stellen den Wert der Eigenschaft <b>bolIstDetailtabelle <\/b>auf den Wert <b>True <\/b>ein.<\/p>\n<p>Dann durchlaufen wir in einer weiteren <b>For Each<\/b>-Schleife alle Eintr&auml;ge der Tabellen, die bereits in der Collection namens <b>colReihenfolge <\/b>gelandet sind. Befindet sich dort die Tabelle, die in der Beziehung als Mastertabelle angegeben ist, wird <b>bolIstDetailtabelle <\/b>wieder auf <b>False <\/b>eingestellt. Der Grund: In der Reihenfolge m&uuml;ssen zuerst die Tabellen auftauchen, die als Mastertabelle der Beziehung dienen &#8211; und das ist der Fall, wenn die in <b>rstBeziehungen!REFERENCED_TABLE_NAME <\/b>angegeben Tabelle bereits in <b>colReihenfolge <\/b>vorhanden ist.<\/p>\n<p>Hat <b>bolIstDetailtabelle <\/b>nach dem Durchlaufen dieser Schleifen den Wert <b>False<\/b>, dann kann die Tabelle in die Collection <b>colReihenfolge <\/b>aufgenommen werden und aus der Collection <b>colOffen <\/b>entfernt werden.<\/p>\n<p>Auf diese Weise durchlaufen wir die &auml;u&szlig;ere <b>Do While<\/b>-Schleife, bis keine weiteren Elemente mehr aus <b>colOffen <\/b>in <b>colReihenfolge <\/b>&uuml;bertragen werden k&ouml;nnen oder die Collection <b>colOffen <\/b>leer ist. Danach gibt die Funktion eine Meldung aus, wieviele Tabellen nicht verarbeitet werden konnten und h&auml;ngt diese dann dennoch der Vollst&auml;ndigkeit halber an die Collection <b>colReihenfolge <\/b>an. Die Collection <b>colReihenfolge <\/b>wird dann dem R&uuml;ckgabewert der Funktion zugewiesen.<\/p>\n<h2>Funktion TabellenreihenfolgeKopieren aufrufen<\/h2>\n<p>Die soeben beschriebene Funktion rufen wir dann beispielsweise wie folgt auf:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_TabellenreihenfolgeKopieren()\r\n     <span style=\"color:blue;\">Dim <\/span>colReihenfolge<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Dim <\/span>var<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> colReihenfolge = TabellenreihenfolgeKopieren\r\n     For Each var In colReihenfolge\r\n         <span style=\"color:blue;\">Debug.Print<\/span> var\r\n     <span style=\"color:blue;\">Next<\/span> var\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Dabei werden die gefundenen Tabellen in der korrekten Reihenfolge im Direktfenster ausgegeben. Sie k&ouml;nnen nat&uuml;rlich auch andere Dinge damit erledigen &#8211; zum Beispiel wie im Beitrag <b>Von Version zu Version <\/b>(<b>www.access-im-unternehmen.de\/1208<\/b>) die SQL-Anweisungen zum Kopieren der Datens&auml;tze zusammenstellen.<\/p>\n<h2>Reihenfolge zum L&ouml;schen ermitteln<\/h2>\n<p>F&uuml;r das Kopieren der Daten verwenden wir die Funktion <b>TabellenreihenfolgeLoeschen<\/b> aus Listing 3. Diese Funktion ist prinzipiell genauso aufgebaut wie die Funktion zum Ermitteln der Kopierreihenfolge.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>TabellenreihenfolgeLoeschen(strVerbindungszeichenfolge<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Dim <\/span>colOffen<span style=\"color:blue;\"> As <\/span>Collection, colReihenfolge<span style=\"color:blue;\"> As <\/span>Collection, bolIstMastertabelle<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>varOffen<span style=\"color:blue;\"> As Variant<\/span>, varReihenfolge<span style=\"color:blue;\"> As Variant<\/span>, intCountVorher<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>rstTabellen<span style=\"color:blue;\"> As <\/span>ADODB.Recordset, rstBeziehungen<span style=\"color:blue;\"> As <\/span>ADODB.Recordset, strSQL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> colOffen = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Set<\/span> colReihenfolge = <span style=\"color:blue;\">New<\/span> Collection\r\n     <span style=\"color:blue;\">Set<\/span> rstTabellen = GetRecordset(GetConnection(strVerbindungszeichenfolge), \"SHOW TABLES\")\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstTabellen.EOF\r\n         colOffen.Add rstTabellen.Fields(0).Value, rstTabellen.Fields(0).Value\r\n         rstTabellen.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     strSQL = \"SELECT TABLE_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME \" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n         & \"FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE\" & <span style=\"color:blue;\">vbCrLf<\/span> & \"WHERE REFERENCED_TABLE_NAME IS NOT NULL;\"\r\n     <span style=\"color:blue;\">Set<\/span> rstBeziehungen = GetRecordset(GetConnection(cStrVerbindungszeichenfolgeAlt), strSQL)\r\n     <span style=\"color:blue;\">Do While<\/span> colOffen.Count &gt; 0\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> intCountVorher = colOffen.Count<span style=\"color:blue;\"> Then<\/span>\r\n             intCountVorher = colOffen.Count\r\n             For Each varOffen In colOffen\r\n                 bolIstMastertabelle = <span style=\"color:blue;\">False<\/span>\r\n                 rstBeziehungen.MoveFirst\r\n                 <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rstBeziehungen.EOF\r\n                     <span style=\"color:blue;\">If <\/span>rstBeziehungen!REFERENCED_TABLE_NAME = varOffen<span style=\"color:blue;\"> Then<\/span>\r\n                         bolIstMastertabelle = <span style=\"color:blue;\">True<\/span>\r\n                         For Each varReihenfolge In colReihenfolge\r\n                             <span style=\"color:blue;\">If <\/span>rstBeziehungen!TABLE_NAME = varReihenfolge<span style=\"color:blue;\"> Then<\/span>\r\n                                 bolIstMastertabelle = <span style=\"color:blue;\">False<\/span>\r\n                                 <span style=\"color:blue;\">Exit For<\/span>\r\n                             <span style=\"color:blue;\">End If<\/span>\r\n                         <span style=\"color:blue;\">Next<\/span> varReihenfolge\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                     rstBeziehungen.Move<span style=\"color:blue;\">Next<\/span>\r\n                 <span style=\"color:blue;\">Loop<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>bolIstMastertabelle = <span style=\"color:blue;\">False<\/span><span style=\"color:blue;\"> Then<\/span>\r\n                     colReihenfolge.Add varOffen, varOffen\r\n                     colOffen.Remove varOffen\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 DoEvents\r\n             <span style=\"color:blue;\">Next<\/span> varOffen\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">Exit Do<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">MsgBox<\/span> \"Anzahl offener Tabellen (da Zirkelbezug): \" & colOffen.Count & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n         & \"Die Tabellen werden an die Collection angeh&auml;ngt.\"\r\n     For Each varOffen In colOffen\r\n         colReihenfolge.Add varOffen, varOffen\r\n     <span style=\"color:blue;\">Next<\/span> varOffen\r\n     <span style=\"color:blue;\">Set<\/span> TabellenreihenfolgeLoeschen = colReihenfolge\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Ermitteln der Reihenfolge f&uuml;r das L&ouml;schen von Daten<\/span><\/b><\/p>\n<p>Allerdings gibt es einen entscheidenden Unterschied: In der inneren <b>Do While<\/b>-Schleife suchen wir zuerst nach den Eintr&auml;gen des Recordsets <b>rstBeziehungen<\/b>, deren Feld <b>REFERENCED_TABLE_NAME <\/b>mit der Tabelle aus <b>varOffen <\/b>&uuml;bereinstimmt, also den Tabellen, welche das Prim&auml;rschl&uuml;sselfeld der Beziehung enthalten und somit der Mastertabelle entsprechen.<\/p>\n<p>Und in der inneren <b>If&#8230;Then<\/b>-Bedingung pr&uuml;fen wir dann, ob die Tabelle aus <b>TABLE_NAME<\/b>, also die Detailtabelle, zu der Tabelle aus <b>varReihenfolge <\/b>passt. Dann k&ouml;nnen wir <b>bolIstMastertabelle <\/b>auf <b>False <\/b>einstellen und sp&auml;ter dann die aktuelle Tabelle aus <b>varOffen <\/b>zu <b>colReihenfolge <\/b>hinzuf&uuml;gen.<\/p>\n<p>Der Testaufruf dieser Funktion k&ouml;nnte dann etwa wie folgt aussehen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>Test_TabellenreihenfolgeLoeschen()\r\n     <span style=\"color:blue;\">Dim <\/span>colReihenfolge<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Dim <\/span>var<span style=\"color:blue;\"> As Variant<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> colReihenfolge = TabellenreihenfolgeLoeschen( cStrVerbindungszeichenfolgeNeu)\r\n     For Each var In colReihenfolge\r\n         <span style=\"color:blue;\">Debug.Print<\/span> var\r\n     <span style=\"color:blue;\">Next<\/span> var\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h2>M&ouml;gliche Probleme<\/h2>\n<p>Wenn Sie die zu l&ouml;schenden oder zu kopierenden Tabellen ermitteln, k&ouml;nnen Sie das nur auf Basis der Tabellen der Quelldatenbank erledigen, auf Basis der Zieldatenbank oder auf Basis der Tabellen, die sowohl in der Quell- als auch in der Zieldatenbank vorkommen.<\/p>\n<p>In allen F&auml;llen k&ouml;nnen Probleme auftauchen. Beim L&ouml;schen kann es sein, dass die Tabelle der Zieldatenbank, deren Daten gel&ouml;scht werden sollen, m&ouml;glicherweise gar nicht vorhanden sind. Oder die Zieldatenbank enth&auml;lt Tabellen, die nicht in der Quelldatenbank enthalten sind &#8211; was zum Problem f&uuml;hrt, wenn eine ber&uuml;cksichtigte Tabelle mit einer nicht ber&uuml;cksichtigten Tabelle so verkn&uuml;pft ist, dass ein L&ouml;schen aus der Tabelle wegen der Beziehung nicht m&ouml;glich ist.<\/p>\n<p>Beim Kopieren kann es ebenfalls sein, dass Daten aus der Quelldatenbank nicht in der Zieldatenbank vorhanden sind, was zu Fehlern f&uuml;hrt, wenn man einen Kopiervorgang auf Basis der Tabellen in der ermittelten Reihenfolge durchf&uuml;hrt. Und wenn in der Reihenfolge ber&uuml;cksichtigte Tabellen der Zieldatenbank mit nicht ber&uuml;cksichtigten Tabellen so verkn&uuml;pft sind, dass die zu kopierende Tabelle das Fremdschl&uuml;sselfeld enth&auml;lt, kommt es ebenfalls zu Problemen, wenn das Fremdschl&uuml;sselfeld einen Prim&auml;rschl&uuml;sselwert der nicht ber&uuml;cksichtigten Tabelle enthalten muss.<\/p>\n<p>Wie Sie mit solchen Konstellationen umgehen, beschreiben wir im Beitrag <b>Von Version zu Version <\/b>(<b>www.access-im-unternehmen.de\/1208<\/b>).<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>KopierUndLoeschreihenfolgeInMySQL.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/6316953D-AD1C-48CD-BCAA-FAA3E7435E95\/aiu_1207.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Kopier- und L&ouml;schreihenfolge f&uuml;r Tabellen&#8220; (www.access-im-unternehmen.de\/926) haben wir ermittelt, wie wir die richtige Reihenfolge f&uuml;r das L&ouml;schen von Tabellen und das Kopieren von Tabelleninhalten von einer Datenbank in die n&auml;chste ermitteln. Wenn Sie die Reihenfolge nicht beachten, kann es n&auml;mlich sein, dass Datens&auml;tze wegen Fremdschl&uuml;sselverletzungen nicht gel&ouml;scht und auch nicht kopiert werden k&ouml;nnen. Im vorliegenden Beitrag zeigen wir, wie Sie die vorgestellte L&ouml;sung f&uuml;r das L&ouml;schen und Kopieren von Tabellen in MySQL-Datenbanken nutzen k&ouml;nnen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662019,66052019,44000022],"tags":[],"class_list":["post-55001207","post","type-post","status-publish","format-standard","hentry","category-662019","category-66052019","category-SQL_Server_und_Co"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Kopier- und L&ouml;schreihenfolge in MySQL - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kopier- und L&ouml;schreihenfolge in MySQL\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Kopier- und L&ouml;schreihenfolge f&uuml;r Tabellen&quot; (www.access-im-unternehmen.de\/926) haben wir ermittelt, wie wir die richtige Reihenfolge f&uuml;r das L&ouml;schen von Tabellen und das Kopieren von Tabelleninhalten von einer Datenbank in die n&auml;chste ermitteln. Wenn Sie die Reihenfolge nicht beachten, kann es n&auml;mlich sein, dass Datens&auml;tze wegen Fremdschl&uuml;sselverletzungen nicht gel&ouml;scht und auch nicht kopiert werden k&ouml;nnen. Im vorliegenden Beitrag zeigen wir, wie Sie die vorgestellte L&ouml;sung f&uuml;r das L&ouml;schen und Kopieren von Tabellen in MySQL-Datenbanken nutzen k&ouml;nnen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T20:56:39+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg06.met.vgwort.de\/na\/283ca2e7b41b44c584423be5c21dd4eb\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"15\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kopier_und_Loeschreihenfolge_in_MySQL\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kopier_und_Loeschreihenfolge_in_MySQL\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Kopier- und L&ouml;schreihenfolge in MySQL\",\"datePublished\":\"2020-05-13T20:56:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kopier_und_Loeschreihenfolge_in_MySQL\\\/\"},\"wordCount\":2258,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kopier_und_Loeschreihenfolge_in_MySQL\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/283ca2e7b41b44c584423be5c21dd4eb\",\"articleSection\":[\"2019\",\"5\\\/2019\",\"SQL Server und Co.\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kopier_und_Loeschreihenfolge_in_MySQL\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kopier_und_Loeschreihenfolge_in_MySQL\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kopier_und_Loeschreihenfolge_in_MySQL\\\/\",\"name\":\"Kopier- und L&ouml;schreihenfolge in MySQL - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kopier_und_Loeschreihenfolge_in_MySQL\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kopier_und_Loeschreihenfolge_in_MySQL\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/283ca2e7b41b44c584423be5c21dd4eb\",\"datePublished\":\"2020-05-13T20:56:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kopier_und_Loeschreihenfolge_in_MySQL\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kopier_und_Loeschreihenfolge_in_MySQL\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kopier_und_Loeschreihenfolge_in_MySQL\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/283ca2e7b41b44c584423be5c21dd4eb\",\"contentUrl\":\"http:\\\/\\\/vg06.met.vgwort.de\\\/na\\\/283ca2e7b41b44c584423be5c21dd4eb\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kopier_und_Loeschreihenfolge_in_MySQL\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kopier- und L&ouml;schreihenfolge in MySQL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Kopier- und L&ouml;schreihenfolge in MySQL - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/","og_locale":"de_DE","og_type":"article","og_title":"Kopier- und L&ouml;schreihenfolge in MySQL","og_description":"Im Beitrag \"Kopier- und L&ouml;schreihenfolge f&uuml;r Tabellen\" (www.access-im-unternehmen.de\/926) haben wir ermittelt, wie wir die richtige Reihenfolge f&uuml;r das L&ouml;schen von Tabellen und das Kopieren von Tabelleninhalten von einer Datenbank in die n&auml;chste ermitteln. Wenn Sie die Reihenfolge nicht beachten, kann es n&auml;mlich sein, dass Datens&auml;tze wegen Fremdschl&uuml;sselverletzungen nicht gel&ouml;scht und auch nicht kopiert werden k&ouml;nnen. Im vorliegenden Beitrag zeigen wir, wie Sie die vorgestellte L&ouml;sung f&uuml;r das L&ouml;schen und Kopieren von Tabellen in MySQL-Datenbanken nutzen k&ouml;nnen.","og_url":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T20:56:39+00:00","og_image":[{"url":"http:\/\/vg06.met.vgwort.de\/na\/283ca2e7b41b44c584423be5c21dd4eb","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Kopier- und L&ouml;schreihenfolge in MySQL","datePublished":"2020-05-13T20:56:39+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/"},"wordCount":2258,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/283ca2e7b41b44c584423be5c21dd4eb","articleSection":["2019","5\/2019","SQL Server und Co."],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/","url":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/","name":"Kopier- und L&ouml;schreihenfolge in MySQL - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/#primaryimage"},"thumbnailUrl":"http:\/\/vg06.met.vgwort.de\/na\/283ca2e7b41b44c584423be5c21dd4eb","datePublished":"2020-05-13T20:56:39+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/#primaryimage","url":"http:\/\/vg06.met.vgwort.de\/na\/283ca2e7b41b44c584423be5c21dd4eb","contentUrl":"http:\/\/vg06.met.vgwort.de\/na\/283ca2e7b41b44c584423be5c21dd4eb"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Kopier_und_Loeschreihenfolge_in_MySQL\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Kopier- und L&ouml;schreihenfolge in MySQL"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001207","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001207"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001207\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001207"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001207"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001207"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}