Wie finde ich Abhängigkeiten von einer Tabelle in MySQL 5.0?

7

Ich versuche, eine Tabelle in MySQL zu löschen, beschwere mich jedoch über "Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl" ...

Fragen

  • Gibt es eine Möglichkeit, alle davon abhängigen Tabellenabhängigkeiten und Objekte herauszufinden?
  • Für Sybase bietet DBArtisan eine wirklich einfache Möglichkeit, Abhängigkeiten zu finden. Gibt es ein solches Tool für MySQL?
user325643
quelle

Antworten:

5

Ab MySQL 5.0 können Sie unter anderem information_schema.table_constraints überprüfen

Führen Sie Folgendes aus, um beispielsweise die Anzahl der Fremdschlüsselbeziehungen für eine bestimmte Tabelle (mydb.mytable) abzurufen:

SELECT COUNT(1) FROM information_schema.table_constraints
WHERE table_schema = 'mydb'
AND table_name = 'mytable'
AND constraint_type='FOREIGN KEY';

Ab MySQL 5.1 können Sie auch information_schema.referential_constraints verwenden . Hier ist das Tabellenlayout:

mysql> show create table information_schema.referential_constraints\G
*************************** 1. row ***************************
       Table: REFERENTIAL_CONSTRAINTS
Create Table: CREATE TEMPORARY TABLE `REFERENTIAL_CONSTRAINTS` (
  `CONSTRAINT_CATALOG` varchar(512) DEFAULT NULL,
  `CONSTRAINT_SCHEMA` varchar(64) NOT NULL DEFAULT '',
  `CONSTRAINT_NAME` varchar(64) NOT NULL DEFAULT '',
  `UNIQUE_CONSTRAINT_CATALOG` varchar(512) DEFAULT NULL,
  `UNIQUE_CONSTRAINT_SCHEMA` varchar(64) NOT NULL DEFAULT '',
  `UNIQUE_CONSTRAINT_NAME` varchar(64) DEFAULT NULL,
  `MATCH_OPTION` varchar(64) NOT NULL DEFAULT '',
  `UPDATE_RULE` varchar(64) NOT NULL DEFAULT '',
  `DELETE_RULE` varchar(64) NOT NULL DEFAULT '',
  `TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
  `REFERENCED_TABLE_NAME` varchar(64) NOT NULL DEFAULT ''
) ENGINE=MEMORY DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

Überprüfen Sie einfach die Spalten tabellenname und referenzierter tabellenname.

RolandoMySQLDBA
quelle
1

Sie können Toad für MySQL verwenden , das kostenlos ist. Mit Toad können Sie visuelle ER-Diagramme erstellen und Ihre Abhängigkeiten ermitteln.

Stanley Johns
quelle
0

Ich habe diese Lösung auf 5.5 getestet, aber sie sollte auch ab 5.1 funktionieren.

Diese Abfrage kann Ihnen alle Verweise auf Ihre Tabelle anzeigen:

Denken Sie daran, "mydb" und "mytable" durch die benötigten zu ersetzen. Es ist auch möglich, dies als ANSICHT für zukünftige Verwendungen zu definieren.

SELECT rc.`CONSTRAINT_CATALOG`   AS `ChildTable_Catalog`
, rc.`CONSTRAINT_SCHEMA`         AS `ChildTable_Schema`
, rc.`TABLE_NAME`                AS `ChildTable`
, rc.`CONSTRAINT_NAME`           AS `ChildTable_ForeignKey`
, GROUP_CONCAT(DISTINCT fk.`COLUMN_NAME` ORDER BY fk.`ORDINAL_POSITION` ASC) AS `ChildTable_ForeignKey_Columns`
, rc.`UNIQUE_CONSTRAINT_CATALOG` AS `ParentTable_Catalog`
, rc.`UNIQUE_CONSTRAINT_SCHEMA`  AS `ParentTable_Schema`
, rc.`REFERENCED_TABLE_NAME`     AS `Parent_Table`
, rc.`UNIQUE_CONSTRAINT_NAME`    AS `ParentTable_UniqueKey`
, GROUP_CONCAT(DISTINCT uk.`COLUMN_NAME` ORDER BY fk.`ORDINAL_POSITION` ASC) AS `ParentTable_UniqueKey_Columns`
-- constraint relation
FROM INFORMATION_SCHEMA.`REFERENTIAL_CONSTRAINTS` AS rc
-- foreign key 
INNER JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS fk 
    ON rc.`CONSTRAINT_CATALOG`        = fk.`CONSTRAINT_CATALOG`
   AND rc.`CONSTRAINT_SCHEMA`         = fk.`CONSTRAINT_SCHEMA`
   AND rc.`TABLE_NAME`                = fk.`TABLE_NAME`
   AND rc.`CONSTRAINT_NAME`           = fk.`CONSTRAINT_NAME`
-- unique key
INNER JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS uk 
    ON rc.`UNIQUE_CONSTRAINT_CATALOG` = uk.`CONSTRAINT_CATALOG`
   AND rc.`UNIQUE_CONSTRAINT_SCHEMA`  = uk.`CONSTRAINT_SCHEMA`
   AND rc.`REFERENCED_TABLE_NAME`     = uk.`TABLE_NAME`
   AND rc.`UNIQUE_CONSTRAINT_NAME`    = uk.`CONSTRAINT_NAME`
-- optional filter condition
WHERE rc.`UNIQUE_CONSTRAINT_SCHEMA` = 'mydb'
  AND rc.`REFERENCED_TABLE_NAME`    = 'mytable'
-- necessary grouping parameters
GROUP BY rc.`CONSTRAINT_CATALOG`
, rc.`CONSTRAINT_SCHEMA` 
, rc.`TABLE_NAME`
, rc.`CONSTRAINT_NAME`
, rc.`UNIQUE_CONSTRAINT_CATALOG`
, rc.`UNIQUE_CONSTRAINT_SCHEMA`
, rc.`REFERENCED_TABLE_NAME`
, rc.`UNIQUE_CONSTRAINT_NAME`
-- optional ordering parameters
ORDER BY rc.`CONSTRAINT_CATALOG` ASC
, rc.`CONSTRAINT_SCHEMA` ASC
, rc.`REFERENCED_TABLE_NAME` ASC
, rc.`TABLE_NAME` ASC
;
carlososuna86
quelle
0

Sie können dies für die Suche nach Ihrem Fremdschlüssel und Target_Table verwenden. Sie müssen lediglich die where-Klausel ändern, um Ihren spezifischen Schlüssel zu finden.

select distinct ref.referenced_table_name Source_Table,
                tab.constraint_name,
                tab.constraint_type,
                tab.table_name  Target_Table
from information_schema.table_constraints tab,
     information_schema.referential_constraints ref
where tab.constraint_name = ref.constraint_name;
Alex
quelle
0

Auch nützlich, wenn Sie wissen möchten, welche Zusatztabellen auf die FK einer Tabelle verweisen.

SELECT
TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME
FROM
INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
REFERENCED_TABLE_NAME = 'your_table_name';
Siliconrockstar
quelle