INFORMATION SCHEMA придумали инопланетяне
Nov. 18th, 2009 01:36 pmЕсть в SQL такая тема, называется information schema. Если нужно узнать какие в таблице поля, там, ключи, то говорят в information schema ищи. Все это, ребята, круто конечно, но вот нужно мне было узнать какие в таблице ключи внешние. Пишу SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS, но вот фигня - на какие поля/таблицы ссылается ключ нифига не понять.
Придумал в общем запрос, но он большой шо капец, вот такая байда:
SELECT FK.TABLE_NAME, CU.COLUMN_NAME, PK.TABLE_NAME, PT.COLUMN_NAME, C.CONSTRAINT_NAME
FROM
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN
(
SELECT i1.TABLE_NAME, i2.COLUMN_NAME
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
) PT
ON PT.TABLE_NAME = PK.TABLE_NAME
WHERE FK.table_name = 'my_tablename'
Не, ну нормально, да? А ведь information schema это стандарт, типа ГОСТа, по уму, все в ней найти должно быть просто. А на самом деле легко там не найдешь ничего, поэтому и написал этот стих я.
Придумал в общем запрос, но он большой шо капец, вот такая байда:
SELECT FK.TABLE_NAME, CU.COLUMN_NAME, PK.TABLE_NAME, PT.COLUMN_NAME, C.CONSTRAINT_NAME
FROM
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN
(
SELECT i1.TABLE_NAME, i2.COLUMN_NAME
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
) PT
ON PT.TABLE_NAME = PK.TABLE_NAME
WHERE FK.table_name = 'my_tablename'
Не, ну нормально, да? А ведь information schema это стандарт, типа ГОСТа, по уму, все в ней найти должно быть просто. А на самом деле легко там не найдешь ничего, поэтому и написал этот стих я.