我有一个大型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中都这样做很感兴趣。
在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'
在ORACLE中
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'