2014-01-31 3 views
0

Возможно ли запросить MySQL для определения поведения FK CASCADE? В настоящее время я делаю это:MySQL - запрос для внешнего ключа поведения CASCADE

SELECT 
    COLUMN_NAME, 
    REFERENCED_TABLE_NAME, 
    REFERENCED_COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE 
    TABLE_SCHEMA = 'my_db' 
    AND 
    TABLE_NAME = 'my_table' 
    AND 
    REFERENCED_COLUMN_NAME IS NOT NULL 

Это здорово - это дает мне почти всю информацию, мне нужно программно создать подобные FKs на клонов my_table. К сожалению, для INFORMATION_SCHEMA, похоже, нет информации о поведении FK's CASCADE. Не вникая в особенности того, зачем мне нужна эта информация, я просто хотел бы знать: есть ли способ запросить ее?

EDIT - прежде чем люди начнут предлагать его, CREATE TABLE LIKE ... не будет работать в моем сценарии, насколько копирует FKs.

+2

[documentation] (http://dev.mysql.com/doc/refman/5.5/en/referential-constraints-table.html) описывает таблицу 'information_schema.referential_constraints', но у меня нет этого в моей конфигурации. – Barmar

+0

@Barmar Спасибо, я загляну в него – Madbreaks

ответ

1

На основе предложения в комментарии по @Barmar, вот что я в конечном итоге происходит с:

SELECT 
    U.COLUMN_NAME, 
    U.REFERENCED_TABLE_NAME, 
    U.REFERENCED_COLUMN_NAME, 
    C.UPDATE_RULE, 
    C.DELETE_RULE 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE U 
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
    ON U.CONSTRAINT_NAME = C.CONSTRAINT_NAME 
WHERE 
    U.TABLE_SCHEMA = 'my_db' 
    AND 
    U.TABLE_NAME = 'my_table' 
    AND 
    U.REFERENCED_COLUMN_NAME IS NOT NULL 

Что дает мне все, что мне нужно, чтобы воссоздать внешние ключи правильно:

+---------------------+-------------+-----------------------+------------------------+-------------+-------------+ 
| TABLE_NAME | COLUMN_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME | UPDATE_RULE | DELETE_RULE | 
+---------------------+-------------+-----------------------+------------------------+-------------+-------------+ 
| my_table | item_id  | item     | id      | CASCADE  | CASCADE  | 
+---------------------+-------------+-----------------------+------------------------+-------------+-------------+ 
1

Зная имя таблицы, вы можете использовать команду SHOW CREATE TABLE для получения точного поведения рассматриваемого ограничения. Затем вам нужно будет провести синтаксический анализ, который будет проще выполнять на стороне приложения, а не в MySQL. (Спасибо!)

+0

Плюс-1 за идею, но я надеюсь на что-то родное, которое я могу использовать, чтобы найти эту информацию. – Madbreaks

+0

Предложение от @Barmar выше выглядит многообещающим. –

Смежные вопросы