Befehl zum Einschränken von Tabellen anzeigen

224

Ich habe Tabellen, für die ich versucht habe, PK FK-Beziehungen festzulegen, aber ich möchte dies überprüfen. Wie kann ich die PK / FK-Beschränkungen anzeigen? Ich habe diese Handbuchseite gesehen, aber sie zeigt keine Beispiele und meine Google-Suche war auch erfolglos. Meine Datenbank ist credentialing1und meine eingeschränkten Tabellen sind practicesund cred_insurances.

Kapitän Claptrap
quelle

Antworten:

414

ich benutze

SHOW CREATE TABLE mytable;

Dies zeigt Ihnen die SQL-Anweisung, die zum erneuten Erstellen mytablein der aktuellen Form erforderlich ist . Sie können alle Spalten und ihre Typen (wie DESC) anzeigen, aber es werden auch Informationen zu Einschränkungen (und Tabellentyp, Zeichensatz usw.) angezeigt.

Adrian Smith
quelle
8
Ich glaube nicht, dass es die eingehenden fk-Beziehungen zeigt? wie zum Beispiel a.col_one references b.col_oneund in show create table bwird keine Details über die oben erwähnte Beziehung enthalten.
Vineet Menon
1
Ich habe bestätigt, dass dieser Befehl die Fremdschlüsseleinschränkung nicht anzeigt.
Kemin Zhou
2
Beachten Sie, dass MariaDB ab 10.2 hier unangenehme Ergebnisse liefert. jira.mariadb.org/browse/MDEV-15377
Stamster
116

Fragen Sie einfach das INFORMATION_SCHEMA ab:

USE INFORMATION_SCHEMA;
SELECT TABLE_NAME,
       COLUMN_NAME,
       CONSTRAINT_NAME,
       REFERENCED_TABLE_NAME,
       REFERENCED_COLUMN_NAME
FROM KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = "<your_database_name>" 
      AND TABLE_NAME = "<your_table_name>" 
      AND REFERENCED_COLUMN_NAME IS NOT NULL;
Resh32
quelle
14
Dies ist die beste Antwort, da Sie das Ergebnis in einem Format erhalten, das Sie programmgesteuert verwenden können. Natürlich müssen Sie eine WHERE-Klausel hinzufügen, um die Ergebnisse
einzugrenzen
Dies hat mir geholfen, eine beschädigte Tabelle zu finden, deren Spalte 'id' auf mehrere Fremdschlüssel verweist. Kein Wunder, dass die Tabelle 1452 IntegrityError hat.
Vicky T
Das ist eine großartige Antwort! Danke @ Resh32
simhumileco
Ich finde es toll, dass Sie Ihrer Antwort "Einfach" vorangestellt haben. Tolle Antwort!
Leviathanbadger
Das wird nicht die tatsächlichen Einschränkungsregeln anzeigen - zBON UPDATE CASCADE
Stamster
19

Das Hauptproblem bei der validierten Antwort besteht darin, dass Sie die Ausgabe analysieren müssen, um die Informationen zu erhalten. Hier ist eine Abfrage, mit der Sie sie benutzerfreundlicher abrufen können:

SELECT cols.TABLE_NAME, cols.COLUMN_NAME, cols.ORDINAL_POSITION,
cols.COLUMN_DEFAULT, cols.IS_NULLABLE, cols.DATA_TYPE,
    cols.CHARACTER_MAXIMUM_LENGTH, cols.CHARACTER_OCTET_LENGTH,
    cols.NUMERIC_PRECISION, cols.NUMERIC_SCALE,
    cols.COLUMN_TYPE, cols.COLUMN_KEY, cols.EXTRA,
    cols.COLUMN_COMMENT, refs.REFERENCED_TABLE_NAME, refs.REFERENCED_COLUMN_NAME,
    cRefs.UPDATE_RULE, cRefs.DELETE_RULE,
    links.TABLE_NAME, links.COLUMN_NAME,
    cLinks.UPDATE_RULE, cLinks.DELETE_RULE
FROM INFORMATION_SCHEMA.`COLUMNS` as cols
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS refs
ON refs.TABLE_SCHEMA=cols.TABLE_SCHEMA
    AND refs.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA
    AND refs.TABLE_NAME=cols.TABLE_NAME
    AND refs.COLUMN_NAME=cols.COLUMN_NAME
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cRefs
ON cRefs.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA
    AND cRefs.CONSTRAINT_NAME=refs.CONSTRAINT_NAME
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS links
ON links.TABLE_SCHEMA=cols.TABLE_SCHEMA
    AND links.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA
    AND links.REFERENCED_TABLE_NAME=cols.TABLE_NAME
    AND links.REFERENCED_COLUMN_NAME=cols.COLUMN_NAME
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cLinks
ON cLinks.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA
    AND cLinks.CONSTRAINT_NAME=links.CONSTRAINT_NAME
WHERE cols.TABLE_SCHEMA=DATABASE()
    AND cols.TABLE_NAME="table"
nfroidure
quelle
11

Um eine Anfrage an information_schemaSie zu stellen, benötigen Sie Berechtigungen. Wenn Sie eine einfache Liste von Schlüsseln benötigen, können Sie diesen Befehl verwenden:

SHOW INDEXES IN <tablename>
Pleerock
quelle
Wie ist das Aufrufen von information_schema besser als das, vielen Dank
Eiad Samman
6

Versuchen Sie Folgendes:

SHOW TABLE STATUS FROM credentialing1;

Die Fremdschlüsseleinschränkungen sind in der Spalte Kommentar der Ausgabe aufgeführt.

Codaddict
quelle
3
Ich sehe nur Tabellenkommentare in der Spalte Kommentar. Es hat wahrscheinlich etwas mit InnoDB-Typen zu tun.
Uhrwerk
1
Kommentare sind nur für Benutzerkommentare. Das ist sicher nicht der Ort, an dem FK-Definitionen gespeichert werden! Wenn sie für Sie sind, muss dies in Ihrem Namen von einem RDBMS-Tool durchgeführt worden sein.
Stamster
6

Sie können dies verwenden:

select
    table_name,column_name,referenced_table_name,referenced_column_name
from
    information_schema.key_column_usage
where
    referenced_table_name is not null
    and table_schema = 'my_database' 
    and table_name = 'my_table'

Oder verwenden Sie für eine besser formatierte Ausgabe Folgendes:

select
    concat(table_name, '.', column_name) as 'foreign key',  
    concat(referenced_table_name, '.', referenced_column_name) as 'references'
from
    information_schema.key_column_usage
where
    referenced_table_name is not null
    and table_schema = 'my_database' 
    and table_name = 'my_table'
Abhishek Gupta
quelle
ORA-00942: Tabelle oder Ansicht existiert nicht 00942. 00000 - "Tabelle oder Ansicht existiert nicht" * Ursache: * Maßnahme: Fehler in Zeile: 29 Spalte: 5 Zeile 29 ist "information_schema.key_column_usage"
noboundaries
2
@noboundaries Sie versuchen, dass auf Oracle die Frage über MySQL
ymajoros
1

Analog zu @ Resh32 , jedoch ohne die USEAnweisung verwenden zu müssen:

SELECT TABLE_NAME,
       COLUMN_NAME,
       CONSTRAINT_NAME,
       REFERENCED_TABLE_NAME,
       REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = "database_name" 
      AND TABLE_NAME = "table_name" 
      AND REFERENCED_COLUMN_NAME IS NOT NULL;

Nützlich, zB mit dem ORM.

simhumileco
quelle
Das wird nicht die tatsächlichen Einschränkungsregeln anzeigen - zBON UPDATE CASCADE
Stamster
0

Es gibt auch ein Tool, das Orakel gemacht hat und das mysqlshow heißt

Wenn Sie es mit der --k keys $table_nameOption ausführen, werden die Tasten angezeigt.

SYNOPSIS
   mysqlshow [options] [db_name [tbl_name [col_name]]]
.......
.......
.......
·   --keys, -k
   Show table indexes.

Beispiel:

╰─➤  mysqlshow -h 127.0.0.1 -u root -p --keys database tokens
Database: database  Table: tokens
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| Field           | Type             | Collation          | Null | Key | Default | Extra          | Privileges                      | Comment |
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
| id              | int(10) unsigned |                    | NO   | PRI |         | auto_increment | select,insert,update,references |         |
| token           | text             | utf8mb4_unicode_ci | NO   |     |         |                | select,insert,update,references |         |
| user_id         | int(10) unsigned |                    | NO   | MUL |         |                | select,insert,update,references |         |
| expires_in      | datetime         |                    | YES  |     |         |                | select,insert,update,references |         |
| created_at      | timestamp        |                    | YES  |     |         |                | select,insert,update,references |         |
| updated_at      | timestamp        |                    | YES  |     |         |                | select,insert,update,references |         |
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table  | Non_unique | Key_name                 | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tokens | 0          | PRIMARY                  | 1            | id          | A         | 2           |          |        |      | BTREE      |         |               |
| tokens | 1          | tokens_user_id_foreign   | 1            | user_id     | A         | 2           |          |        |      | BTREE      |         |               |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
GardenRouteGold
quelle