Mostra vincoli sul comando tabelle


224

Ho delle tabelle su cui ho provato a impostare le relazioni PK FK ma voglio verificarlo. Come posso mostrare le restrizioni PK / FK? Ho visto questa pagina di manuale, ma non mostra esempi e anche la mia ricerca su Google è stata inutile. Il mio database è credentialing1e le mie tabelle vincolate sono practicese cred_insurances.

Risposte:


414

Io uso

SHOW CREATE TABLE mytable;

Questo ti mostra l'istruzione SQL necessaria per ricomporre mytablenella sua forma attuale. Puoi vedere tutte le colonne e i loro tipi (come DESC) ma mostra anche informazioni sui vincoli (e tipo di tabella, set di caratteri, ecc.).


8
non penso che mostri le relazioni fk in arrivo? come ad esempio, a.col_one references b.col_onee in show create table bnon conterrà dettagli sulla relazione di cui sopra.
Vineet Menon,

1
Ho confermato che questo comando non visualizza il vincolo di chiave esterna.
Kemin Zhou,

2
Attenzione che MariaDB a partire dalla 10.2 restituirà risultati imbarazzanti qui. jira.mariadb.org/browse/MDEV-15377
stamster

117

È sufficiente eseguire una query su INFORMATION_SCHEMA:

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;

14
Questa è la risposta migliore perché ti dà il risultato in un formato che puoi usare a livello di codice. Ovviamente dovrai aggiungere una clausola WHERE per restringere i risultati
Naveed Hasan,

Questo mi ha aiutato a trovare una tabella corrotta con la colonna "id" che fa riferimento a diverse chiavi esterne. Non c'è da stupirsi che la tabella abbia ottenuto 1452 IntegrityError.
Vicky T,

Questa è un'ottima risposta! Grazie @ Resh32
simhumileco

Adoro che tu abbia aggiunto il prefisso alla tua risposta con "Semplicemente". Ottima risposta, però!
leviathanbadger,

Ciò non mostrerà le regole di vincolo effettive - ad esempioON UPDATE CASCADE
stamster

19

Il problema principale con la risposta convalidata è che dovrai analizzare l'output per ottenere le informazioni. Ecco una query che ti consente di ottenerli in un modo più utilizzabile:

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"

11

afaik per effettuare una richiesta information_schemaè necessario disporre di privilegi. Se hai bisogno di un semplice elenco di chiavi puoi usare questo comando:

SHOW INDEXES IN <tablename>

In che modo chiamare information_schema è meglio di così, grazie
mille

6

Prova a fare:

SHOW TABLE STATUS FROM credentialing1;

I vincoli di chiave esterna sono elencati nella colonna Commento dell'output.


3
Vedo solo i commenti di tabella nella colonna Commento. Probabilmente ha a che fare con i tipi InnoDB.
clockworkgeek,

1
I commenti sono solo per i commenti degli utenti. Questo non è certo il luogo in cui sono memorizzate le definizioni FK! Se sono per te - deve essere stato fatto per tuo conto da qualche strumento RDBMS.
Criceto

6

Puoi usare questo:

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'

O per un output formattato meglio usa questo:

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'

ORA-00942: la tabella o la vista non esiste 00942. 00000 - "la tabella o la vista non esiste" * Causa: * Azione: errore alla riga: 29 Colonna: 5 La riga 29 è "information_schema.key_column_usage"
noboundaries

2
@noboundaries ci stai provando su Oracle, la domanda è su MySQL
ymajoros,

1

Analogo a @ Resh32 , ma senza la necessità di usare l' USEistruzione:

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;

Utile, ad es. Utilizzando l'ORM.


Ciò non mostrerà le regole di vincolo effettive - ad esempioON UPDATE CASCADE
stamster

0

Esiste anche uno strumento creato da Oracle chiamato mysqlshow

Se lo esegui con l' --k keys $table_nameopzione, verranno visualizzate le chiavi.

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

esempio:

╰─➤  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      |         |               |
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.