sql - 在 SQL 中检索列信息(复合键)

标签 sql sql-server oracle

我有一个大型 SQL 数据库,我需要在其中验证表和列的结构(而不​​是数据本身)。所以我需要生成所有表的列表,然后为每个表生成它的所有列,然后为每一列生成它的数据类型、长度/精度、序号位置,以及它是否是该表的主键的一部分.

我可以通过以下查询获得我需要的大部分内容:

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

但是,我不确定如何检查列是否是主键的一部分。此外,对于那些 PK 由多个列组成的表,我想知道键中每一列的顺序位置。到目前为止,我找到的信息与设置 key 有关,而不是读取 key 。

我有兴趣在 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' 

在甲骨文中

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' 

关于sql - 在 SQL 中检索列信息(复合键),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7662587/

相关文章:

sql - 如何使用 XML 数据更新 SQL 表列

c# - 在 C# 中安全地生成 SQL 查询

SQLCMD 传入变量

linux - DBD-Oracle-1.76 安装问题

MYSQL 跨多个表的计数查询

sql-server - 无法通过存储过程插入两个表

SQL close close 随着时间的推移数据中的差距

SQL select where matching record exists and no matching record

Java v7 不能与 oracle forms 10g 一起使用吗?

excel - 无法连接 SQLState=08004 [Oracle][ODBC][Ora]ORA-12154 : TNS:could not resolve the connect identifier specified in ms odbc administrator