2009-04-30 16 views
199

Mam tabelę, której klucz podstawowy jest odwoływany w kilku innych tabelach jako klucz obcy. Na przykład:Jak znaleźć wszystkie tabele z kluczami obcymi, które odwołują się do określonej tabeli.kolumny i mają wartości dla kluczy obcych?

CREATE TABLE `X` (
    `X_id` int NOT NULL auto_increment, 
    `name` varchar(255) NOT NULL, 
    PRIMARY KEY (`X_id`) 
) 
    CREATE TABLE `Y` (
    `Y_id` int(11) NOT NULL auto_increment, 
    `name` varchar(255) NOT NULL, 
    `X_id` int DEFAULT NULL, 
    PRIMARY KEY (`Y_id`), 
    CONSTRAINT `Y_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`) 
) 
    CREATE TABLE `Z` (
    `Z_id` int(11) NOT NULL auto_increment, 
    `name` varchar(255) NOT NULL, 
    `X_id` int DEFAULT NULL, 
    PRIMARY KEY (`Z_id`), 
    CONSTRAINT `Z_X` FOREIGN KEY (`X_id`) REFERENCES `X` (`X_id`) 
) 

Teraz nie wiem ile istnieją tabele w bazie danych, które zawierają kluczy obcych w tabelach X jak Y i Z. Czy istnieje kwerenda SQL, które można używać do powrotu:

  1. listę tabel, które mają kluczy obcych w X
  2. a które faktycznie mają te tabele wartości klucza obcego
+1

to pytanie pomaga mi przy tak wielu okazjach. Żałuję, że nie mogę głosować więcej niż raz! – iGbanam

Odpowiedz

12

można znaleźć wszystkie informacje o schemacie pokrewnych w rozsądny sposób o nazwie information_schema stół.

Może zajść potrzeba sprawdzenia tabeli REFERENTIAL_CONSTRAINTS i KEY_COLUMN_USAGE. Pierwsza z nich mówi, które tabele są przywoływane przez inne; ten drugi powie ci, jak powiązane są ich pola.

306

Proszę bardzo:

USE information_schema; 
SELECT * 
FROM 
    KEY_COLUMN_USAGE 
WHERE 
    REFERENCED_TABLE_NAME = 'X' 
    AND REFERENCED_COLUMN_NAME = 'X_id'; 

Jeśli masz kilka baz danych o podobnych tabel/nazwy kolumn Można także ograniczyć zapytanie do konkretnej bazy danych: manualna

SELECT * 
FROM 
    KEY_COLUMN_USAGE 
WHERE 
    REFERENCED_TABLE_NAME = 'X' 
    AND REFERENCED_COLUMN_NAME = 'X_id' 
    AND TABLE_SCHEMA = 'your_database_name'; 
+5

Czy można to zrobić rekursywnie? –

+0

Wielkie dzięki! Bardzo użyteczne ... –

+0

thks ... zadziałało! – htobon

45

MySQL 5.5 Reference : "InnoDB and FOREIGN KEY Constraints"

SELECT 
    ke.REFERENCED_TABLE_SCHEMA parentSchema, 
    ke.referenced_table_name parentTable, 
    ke.REFERENCED_COLUMN_NAME parentColumnName, 
    ke.TABLE_SCHEMA ChildSchema, 
    ke.table_name childTable, 
    ke.COLUMN_NAME ChildColumnName 
FROM 
    information_schema.KEY_COLUMN_USAGE ke 
WHERE 
    ke.referenced_table_name IS NOT NULL 
    AND ke.REFERENCED_COLUMN_NAME = 'ci_id' ## Find Foreign Keys linked to this Primary Key 
ORDER BY 
    ke.referenced_table_name; 
16

To rozwiązanie nie tylko wyświetla wszystkie relacje s ale także nazwa ograniczenia, która jest wymagana w niektórych przypadkach (np. Spadek ograniczeniem):

SELECT 
    CONCAT(table_name, '.', column_name) AS 'foreign key', 
    CONCAT(referenced_table_name, '.', referenced_column_name) AS 'references', 
    constraint_name AS 'constraint name' 
FROM 
    information_schema.key_column_usage 
WHERE 
    referenced_table_name IS NOT NULL; 

Jeśli chcesz sprawdzić tabele w konkretnej bazy danych, należy dodać następujące:

AND table_schema = 'database_name'; 
3

pisałem trochę bash ONLINER że można pisać do skryptu, aby uzyskać przyjazny wyjściowa:

mysql_references_to:

mysql -uUSER -pPASS -A DB_NAME -se "USE information_schema; SELECT * FROM KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = '$1' AND REFERENCED_COLUMN_NAME = 'id'\G" | sed 's/^[ \t]*//;s/[ \t]*$//' |egrep "\<TABLE_NAME|\<COLUMN_NAME" |sed 's/TABLE_NAME: /./g' |sed 's/COLUMN_NAME: //g' | paste -sd "," -| tr '.' '\n' |sed 's/,$//' |sed 's/,/./' 

więc wykonanie: mysql_references_to transaccion (gdzie transaccion jest losowa nazwa tabeli) daje moc takiego:

carrito_transaccion.transaccion_id 
comanda_detalle.transaccion_id 
comanda_detalle_devolucion.transaccion_positiva_id 
comanda_detalle_devolucion.transaccion_negativa_id 
comanda_transaccion.transaccion_id 
cuenta_operacion.transaccion_id 
... 
1

wykaz wszystkich kluczy obcych w DB w tym opisie

SELECT 
    i1.CONSTRAINT_NAME, i1.TABLE_NAME,i1.COLUMN_NAME, 
    i1.REFERENCED_TABLE_SCHEMA,i1.REFERENCED_TABLE_NAME, i1.REFERENCED_COLUMN_NAME, 
    i2.UPDATE_RULE, i2.DELETE_RULE 
    FROM 
    information_schema.KEY_COLUMN_USAGE AS i1 
    INNER JOIN 
    information_schema.REFERENTIAL_CONSTRAINTS AS i2 
    ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
    WHERE i1.REFERENCED_TABLE_NAME IS NOT NULL 
    AND i1.TABLE_SCHEMA ='db_name'; 

ograniczając się do konkretnego kolumna w tabeli tabela

AND i1.table_name = 'target_tb_name' AND i1.column_name = 'target_col_name' 
-1

najprostszym:
1. Otwórz phpMyAdmin
2. Po lewej stronie kliknij nazwę bazy danych
3.W prawym górnym rogu znajdź zakładkę "Projektant"

Wszystkie ograniczenia będą tam widoczne.

Powiązane problemy