我需要一个查询来查看表中是否已有任何索引。
答案 0 :(得分:69)
在SQL Server上,这将列出指定表的所有索引:
select * from sys.indexes
where object_id = (select object_id from sys.objects where name = 'MYTABLE')
此查询将列出所有没有索引的表:
SELECT name
FROM sys.tables
WHERE OBJECTPROPERTY(object_id,'IsIndexed') = 0
这是一个有趣的MSDN常见问题解答,涉及相关主题:
Querying the SQL Server System Catalog FAQ
答案 1 :(得分:16)
如果您使用的是MySQL,则可以运行SHOW KEYS FROM table
或SHOW INDEXES FROM table
答案 2 :(得分:9)
如果您只需要索引列 EXEC sp_helpindex“TABLE_NAME”
答案 3 :(得分:7)
大多数现代RDBMS都支持INFORMATION_SCHEMA
架构。如果您支持,那么您需要INFORMATION_SCHEMA.TABLE_CONSTRAINTS
或INFORMATION_SCHEMA.KEY_COLUMN_USAGE
,或者两者都支持。
看看你的支持是否就像运行
一样简单 select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
编辑:SQL Server确实有INFORMATION_SCHEMA
,它比特定于供应商的表更容易使用,所以请继续使用它。
答案 4 :(得分:3)
在Oracle上:
确定表格中的所有索引:
SELECT index_name
FROM user_indexes
WHERE table_name = :table
确定索引上的列索引和列:
SELECT index_name
, column_position
, column_name
FROM user_ind_columns
WHERE table_name = :table
ORDER BY index_name, column_order
参考文献:
答案 5 :(得分:3)
只需使用以下命令即可找到特定表的索引名和列名
SP_HELPINDEX 'tablename'
这对我有用
答案 6 :(得分:2)
以下是我用于TSQL的问题,它解决了我的表名可能包含模式名称以及可能包含数据库名称的问题:
DECLARE @THETABLE varchar(100);
SET @THETABLE = 'theschema.thetable';
select i.*
from sys.indexes i
where i.object_id = OBJECT_ID(@THETABLE)
and i.name is not NULL;
这个用例就是我想要一个命名表的索引列表,这样我就可以编写一个程序来动态压缩表上的所有索引。
答案 7 :(得分:1)
首先检查你的表id(又名object_id)
SELECT * FROM sys.objects WHERE type = 'U' ORDER BY name
然后你就可以得到专栏的名字了。例如,假设您从先前的查询获得了数字4作为object_id
SELECT c.name
FROM sys.index_columns ic
INNER JOIN sys.columns c ON c.column_id = ic.column_id
WHERE ic.object_id = 4
AND c.object_id = 4
答案 8 :(得分:1)
创建一个存储过程来列出SQL Server中数据库中表的索引
create procedure _ListIndexes(@tableName nvarchar(200))
as
begin
/*
exec _ListIndexes '<YOUR TABLE NAME>'
*/
SELECT DB_NAME(DB_ID()) as DBName,SCH.name + '.' + TBL.name AS TableName,IDX.name as IndexName, IDX.type_desc AS IndexType,COL.Name as ColumnName,IC.*
FROM sys.tables AS TBL
INNER JOIN sys.schemas AS SCH ON TBL.schema_id = SCH.schema_id
INNER JOIN sys.indexes AS IDX ON TBL.object_id = IDX.object_id
INNER JOIN sys.index_columns IC ON IDX.object_id = IC.object_id and IDX.index_id = IC.index_id
INNER JOIN sys.columns COL ON ic.object_id = COL.object_id and IC.column_id = COL.column_id
where TBL.name = @tableName
ORDER BY TableName,IDX.name
end
答案 9 :(得分:-1)
检查一下 这概述了数据库中的相关约束。 还请包括促进具有感兴趣的表名称的条件,以便更快地提供信息。
select
a.TABLE_CATALOG as DB_name,a.TABLE_SCHEMA as tbl_schema, a.TABLE_NAME as tbl_name,a. CONSTRAINT_NAME as constraint_name,b.CONSTRAINT_TYPE
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE a
join INFORMATION_SCHEMA.TABLE_CONSTRAINTS b on
a.CONSTRAINT_NAME=b.CONSTRAINT_NAME