In diesem Artikel werden hauptsächlich die Gründe und Lösungen für die Unfähigkeit von MySQL vorgestellt, Fremdschlüssel zu erstellen. Anschließend erhalten Sie aktuelle Informationen über die Unfähigkeit von MySQL, Fremdschlüssel zu erstellen und die Eigenschaften von Fremdschlüsseln abzufragen.
Beim Verknüpfen zweier Tabellen können keine Fremdschlüssel erstellt werden. Aus diesem Blog können wir ersehen, dass das Problem in der Konsistenz der Optionen „Charset“ und „Collate“ in Punkt 6 auf Tabellenebene und Feldebene liegt. Der Zeichensatz und die Sortierung meiner beiden Tabellen sind inkonsistent und beide Tabellen führen die SQL-Anweisung aus:
alter table 表名 convert to character set utf8;
Löst das Problem perfekt
<; 🎜>ps: Werfen wir einen Blick auf die Unfähigkeit von MySQL, Fremdschlüssel zu erstellen und die Attribute von Fremdschlüsseln abzufragen
MyISAM- und InnoDB-Erklärung
InnoDB und MyISAM sind die beiden am häufigsten verwendeten Tabellentypen, wenn sie MySQL verwenden. Beide Tabellentypen haben je nach spezifischer Anwendung ihre eigenen Vor- und Nachteile. Der grundlegende Unterschied besteht darin, dass der MyISAM-Typ keine erweiterte Verarbeitung wie die Transaktionsverarbeitung unterstützt, während dies beim InnoDB-Typ der Fall ist. Die MyISAM-Typtabelle legt Wert auf Leistung und ihre Ausführungszeiten sind schneller als die des InnoDB-Typs, bietet jedoch keine Transaktionsunterstützung, während InnoDB Transaktionsunterstützung und erweiterte Datenbankfunktionen wie Fremdschlüssel bereitstellt.Im Folgenden sind einige Details und spezifische Implementierungsunterschiede aufgeführt:
◆1.InnoDB unterstützt keine Indizes vom Typ FULLTEXT. ◆2. InnoDB speichert nicht die spezifische Anzahl von Zeilen in der Tabelle. Das heißt, wenn InnoDB „select count(*)“ aus der Tabelle ausführt, muss es die gesamte Tabelle scannen, um zu berechnen, wie viele Zeilen vorhanden sind sind, aber MyISAM benötigt nur ein einfaches Auslesen der Anzahl der gespeicherten Zeilen. Beachten Sie, dass die Operationen der beiden Tabellen identisch sind, wenn die count(*)-Anweisung eine Where-Bedingung enthält. ◆3. Für Felder vom Typ AUTO_INCREMENT muss InnoDB einen Index nur mit diesem Feld enthalten, aber in der MyISAM-Tabelle kann ein gemeinsamer Index mit anderen Feldern eingerichtet werden. ◆4. Beim DELETE FROM table erstellt InnoDB die Tabelle nicht neu, sondern löscht sie Zeile für Zeile. ◆5. Die Operation LOAD TABLE FROM MASTER funktioniert nicht für InnoDB. Die Lösung besteht darin, zuerst die InnoDB-Tabelle in eine MyISAM-Tabelle zu ändern und sie dann nach dem Importieren der Daten in eine InnoDB-Tabelle zu ändern. Für die zusätzlich genutzte InnoDB gelten keine Tabellen mit Attributen (z. B. Fremdschlüssel). Darüber hinaus ist die Zeilensperre der InnoDB-Tabelle nicht absolut. Wenn MySQL beim Ausführen einer SQL-Anweisung den zu scannenden Bereich nicht ermitteln kann, sperrt die InnoDB-Tabelle auch die gesamte Tabelle, z. B. die Aktualisierungstabelle set num=1 where name like „%aaa%“ Der Hauptunterschied zwischen den beiden Typen besteht darin, dass Innodb Transaktionsverarbeitung, Fremdschlüssel und Sperren auf Zeilenebene unterstützt. MyISAM unterstützt es nicht. Daher wird MyISAM oft als nur für den Einsatz in kleinen Projekten geeignet angesehen. Aus der Sicht von Benutzern, die MySQL verwenden, sind Innodb und MyISAM beide die erste Wahl. Wenn die Datenbankplattform die Anforderungen erfüllen möchte: 99,9 % Stabilität, bequeme Skalierbarkeit und hohe Verfügbarkeit Auswahl.Die Gründe sind wie folgt:
1. Die meisten auf der Plattform geführten Projekte sind Projekte mit mehr Lesevorgängen und weniger Schreibvorgängen, und die Leseleistung von MyISAM ist höher viel besser als Innodb. 2. Der Index und die Daten von MyISAM werden getrennt und der Index wird komprimiert, was die Speichernutzung entsprechend erhöht. Es kann mehr Indizes laden und der Index und die Daten von Innodb sind eng miteinander verbunden. Es wird keine Komprimierung verwendet, was dazu führt, dass Innodb viel größer als MyISAM ist. 3. Es kommt häufig alle 1 oder 2 Monate vor, dass ein Anwendungsentwickler versehentlich eine Tabelle aktualisiert und den falschen Bereich schreibt, was dazu führt, dass die Tabelle nicht normal verwendet wird. Dies zeigt die Überlegenheit von MyISAM Nehmen Sie einfach die der Tabelle entsprechende Datei aus dem an diesem Tag kopierten komprimierten Paket, legen Sie sie in einem Datenbankverzeichnis ab, sichern Sie sie dann in SQL, importieren Sie sie zurück in die Hauptdatenbank und füllen Sie das entsprechende Binlog aus. Wenn es Innodb ist, kann es leider nicht so schnell sein. Sagen Sie mir nicht, dass ich Innodb regelmäßig zum Sichern mit dem Export-xxx.sql-Mechanismus auffordern soll, da die kleinste Datenbankinstanz ein Datenvolumen von Dutzenden Gigabyte hat . 4. Aus Sicht der Anwendungslogik sind Select Count (*) und Order By die häufigsten Vorgänge und machen mehr als 60 % der gesamten SQL-Anweisungen aus. Diese Art von Vorgang kann Innodb tatsächlich Viele Leute glauben, dass Innodb Sperren auf Zeilenebene verwendet, die nur dort gültig sind, wo der Primärschlüssel die gesamte Tabelle sperrt. 5. Es gibt oft viele Anwendungsabteilungen, die mich benötigen, um ihnen reguläre Daten bestimmter Tabellen zur Verfügung zu stellen. Das ist sehr praktisch. Senden Sie ihnen einfach die zu dieser Tabelle gehörenden frm.MYD- und MYI-Dateien und überlassen Sie es ihnen Sie können die Datenbank der entsprechenden Version einfach selbst starten, Innodb muss jedoch xxx.sql exportieren, da die Datei nur durch Weitergabe an andere aufgrund des Einflusses der Wörterbuchdatendatei nicht verwendet werden kann. 6. Im Vergleich zu MyISAM für den Einfüge-Schreibvorgang kann Innodb immer noch nicht die Schreibleistung von MyISAM erreichen. Wenn es sich um indexbasierte Aktualisierungsvorgänge handelt, ist MyISAM möglicherweise schlechter als Innodb, aber mit einer so hohen Leistung Gleichzeitiges Schreiben: Ob die Slave-Datenbank aufholen kann, ist ebenfalls ein Problem. Es ist besser, es durch eine Subdatenbank- und Subtabellenarchitektur mit mehreren Instanzen zu lösen. 7. Wenn MyISAM verwendet wird, kann die Zusammenführungs-Engine die Entwicklung der Anwendungsabteilung erheblich beschleunigen. Sie müssen nur einige ausgewählte Zählvorgänge (*) für diese Zusammenführungstabelle ausführen, was für große Anwendungen sehr gut geeignet ist Projekte mit einer Gesamtzahl von etwa Hunderten von Millionen Zeilen. Eine Geschäftstabelle eines bestimmten Typs (z. B. Protokolle, Umfragestatistiken).当然Innodb也不是绝对不用,用事务的项目就用Innodb的。另外,可能有人会说你MyISAM无法抗太多写操作,但是可以通过架构来弥补。
SELECT * FROM information_schema.key_column_usage WHERE table_name='表名' ; show create table 表名 ;
Das obige ist der detaillierte Inhalt vonGründe und Lösungen, warum MySQL keine Fremdschlüssel erstellen kann. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!