Получение информации о столбце (составной ключ) в SQL - PullRequest
2 голосов
/ 05 октября 2011

У меня есть большая база данных SQL, где мне нужно проверить структуру таблиц и столбцов (а не сами данные). Поэтому мне нужно сгенерировать список всех таблиц, затем для каждой таблицы, всех ее столбцов, затем для каждого столбца, его типа данных, длины / точности, порядкового номера и того, является ли он частью первичного ключа для этой таблицы. .

Я могу получить большую часть того, что мне нужно, с помощью следующего запроса:

SELECT TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE
FROM INFORMATION_SCHEMA.COLUMNS

Однако я не уверен, как проверить, является ли столбец частью первичного ключа. Кроме того, для тех таблиц, где PK состоит из более чем одного столбца, я хочу знать порядковый номер каждого столбца в ключе. Информация, которую я нашел до сих пор, касается установки ключа, а не его чтения.

Я заинтересован в том, чтобы сделать это как в SQL Server, так и в Oracle.

1 Ответ

7 голосов
/ 05 октября 2011

В SQL Server вы можете сделать

SELECT K.TABLE_CATALOG, 
       K.TABLE_NAME, 
       K.COLUMN_NAME, 
       K.ORDINAL_POSITION 
FROM   INFORMATION_SCHEMA.KEY_COLUMN_USAGE K 
       INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC 
         ON K.TABLE_CATALOG = TC.TABLE_CATALOG 
            AND K.TABLE_SCHEMA = TC.TABLE_SCHEMA 
            AND K.CONSTRAINT_NAME = TC.CONSTRAINT_NAME 
WHERE  TC.CONSTRAINT_TYPE = 'PRIMARY KEY' 

или

SELECT Object_name(C.OBJECT_ID) TABLE_NAME, 
       C.NAME, 
       IC.INDEX_COLUMN_ID 
FROM   SYS.KEY_CONSTRAINTS K 
       INNER JOIN SYS.INDEX_COLUMNS IC 
         ON K.PARENT_OBJECT_ID = IC.OBJECT_ID 
            AND K.UNIQUE_INDEX_ID = IC.INDEX_ID 
       INNER JOIN SYS.COLUMNS C 
         ON IC.OBJECT_ID = C.OBJECT_ID 
            AND IC.COLUMN_ID = C.COLUMN_ID 
WHERE  K.TYPE = 'PK' 

В ОРАКУЛЕ

SELECT K.OWNER, 
       K.TABLE_NAME, 
       K.INDEX_NAME, 
       C.COLUMN_NAME, 
       C.COLUMN_POSITION 
FROM   ALL_CONSTRAINTS K 
       INNER JOIN ALL_IND_COLUMNS C 
         ON K.OWNER = C.INDEX_OWNER 
            AND K.TABLE_NAME = C.TABLE_NAME 
            AND K.INDEX_NAME = C.INDEX_NAME 
WHERE  K.CONSTRAINT_TYPE = 'P' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...