我有一个大型 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'
or
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'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)