MySQL의 테이블 필드에 인덱스가 있는지 확인하는 방법
MySQL의 테이블 필드에 인덱스가 있는지 확인하려면 어떻게 해야 합니까?
구글에서 여러 번 검색해야 했기 때문에 Q/A를 공유합니다.
사용하다SHOW INDEX
다음과 같이 합니다.
SHOW INDEX FROM [tablename]
문서: https://dev.mysql.com/doc/refman/5.0/en/show-index.html
시험:
SELECT * FROM information_schema.statistics
WHERE table_schema = [DATABASE NAME]
AND table_name = [TABLE NAME] AND column_name = [COLUMN NAME]
인덱스에 지정된 이름을 알 필요 없이 특정 열에 인덱스가 있는지 여부를 알려줍니다.또한 저장 프로시저에서도 작동합니다(인덱스 표시와 반대).
show index from table_name where Column_name='column_name';
SHOW KEYS FROM tablename WHERE Key_name='unique key name'
테이블 내에 고유 키가 존재하는지 여부를 나타냅니다.
다음 문장을 사용합니다.
SHOW INDEX FROM *your_table*
그런 다음 필드에 대한 결과를 확인합니다.row["Table"]
,row["Key_name"]
"Key_name"을 올바르게 입력했는지 확인합니다.
CLI에서 테이블 레이아웃을 표시하려면
desc mytable
또는
show table mytable
GK10이 제안하는 내용에 추가:
다음 문장을 사용합니다: SHOW INDEX FROM your_table
그런 다음 row["Table"], row["Key_name"]필드의 결과를 확인합니다.
"Key_name"을 올바르게 입력했는지 확인합니다.
이를 sql문으로 둘러싸인 PHP(또는 다른 언어)로 처리하여 인덱스 열을 찾을 수 있습니다.기본적으로 SHOW INDEX FROM 'mytable'의 결과를 PHP로 가져온 다음 Column_name 열을 사용하여 인덱스 열을 가져올 수 있습니다.
데이터베이스 연결 문자열을 만들고 다음과 같은 작업을 수행합니다.
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");
$sql = "SHOW INDEX FROM 'mydatabase.mytable' WHERE Key_name = 'PRIMARY';" ;
$result = mysqli_query($mysqli, $sql);
while ($row = $result->fetch_assoc()) {
echo $rowVerbatimsSet["Column_name"];
}
다음 SQL을 사용하여 테이블의 지정된 열이 인덱싱되었는지 여부를 확인할 수 있습니다.
select a.table_schema, a.table_name, a.column_name, index_name
from information_schema.columns a
join information_schema.tables b on a.table_schema = b.table_schema and
a.table_name = b.table_name and
b.table_type = 'BASE TABLE'
left join (
select concat(x.name, '/', y.name) full_path_schema, y.name index_name
FROM information_schema.INNODB_SYS_TABLES as x
JOIN information_schema.INNODB_SYS_INDEXES as y on x.TABLE_ID = y.TABLE_ID
WHERE x.name = 'your_schema'
and y.name = 'your_column') d on concat(a.table_schema, '/', a.table_name, '/', a.column_name) = d.full_path_schema
where a.table_schema = 'your_schema'
and a.column_name = 'your_column'
order by a.table_schema, a.table_name;
조인은 INNODB_SYS_*에 대한 것이므로 일치 인덱스는 INNODB 테이블에서만 가져옵니다.
다음을 사용해 보십시오.
SELECT TRUE
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = "{DB_NAME}"
AND TABLE_NAME = "{DB_TABLE}"
AND COLUMN_NAME = "{DB_INDEXED_FIELD}";
데이터베이스 함수로 열에 대한 인덱스가 존재하는지 확인해야 하는 경우 이 코드를 사용/선택할 수 있습니다.다중 열 인덱스의 위치와 상관없이 인덱스가 존재하는지 확인하려면 부품을 삭제하십시오.AND SEQ_IN_INDEX = 1
.
DELIMITER $$
CREATE FUNCTION `fct_check_if_index_for_column_exists_at_first_place`(
`IN_SCHEMA` VARCHAR(255),
`IN_TABLE` VARCHAR(255),
`IN_COLUMN` VARCHAR(255)
)
RETURNS tinyint(4)
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'Check if index exists at first place in sequence for a given column in a given table in a given schema. Returns -1 if schema does not exist. Returns -2 if table does not exist. Returns -3 if column does not exist. If index exists in first place it returns 1, otherwise 0.'
BEGIN
-- Check if index exists at first place in sequence for a given column in a given table in a given schema.
-- Returns -1 if schema does not exist.
-- Returns -2 if table does not exist.
-- Returns -3 if column does not exist.
-- If the index exists in first place it returns 1, otherwise 0.
-- Example call: SELECT fct_check_if_index_for_column_exists_at_first_place('schema_name', 'table_name', 'index_name');
-- check if schema exists
SELECT
COUNT(*) INTO @COUNT_EXISTS
FROM
INFORMATION_SCHEMA.SCHEMATA
WHERE
SCHEMA_NAME = IN_SCHEMA
;
IF @COUNT_EXISTS = 0 THEN
RETURN -1;
END IF;
-- check if table exists
SELECT
COUNT(*) INTO @COUNT_EXISTS
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE
;
IF @COUNT_EXISTS = 0 THEN
RETURN -2;
END IF;
-- check if column exists
SELECT
COUNT(*) INTO @COUNT_EXISTS
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE
AND COLUMN_NAME = IN_COLUMN
;
IF @COUNT_EXISTS = 0 THEN
RETURN -3;
END IF;
-- check if index exists at first place in sequence
SELECT
COUNT(*) INTO @COUNT_EXISTS
FROM
information_schema.statistics
WHERE
TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE AND COLUMN_NAME = IN_COLUMN
AND SEQ_IN_INDEX = 1;
IF @COUNT_EXISTS > 0 THEN
RETURN 1;
ELSE
RETURN 0;
END IF;
END$$
DELIMITER ;
인덱스가 존재하지 않으면 오류가 발생하므로 특정 인덱스 표시 쿼리를 실행할 수 없습니다.따라서 SQL 오류를 방지하려면 모든 인덱스를 배열로 가져와 루프해야 합니다.
내 방법은 이렇다.테이블에서 모든 인덱스를 가져옵니다(이 경우,leads
그런 다음 foreach 루프에서 컬럼 이름(이 경우)을 확인합니다.province
)의 유무.
$this->name = 'province';
$stm = $this->db->prepare('show index from `leads`');
$stm->execute();
$res = $stm->fetchAll();
$index_exists = false;
foreach ($res as $r) {
if ($r['Column_name'] == $this->name) {
$index_exists = true;
}
}
이렇게 하면 인덱스 속성을 좁힐 수 있습니다.을 실행합니다.print_r
$res
어떤 일을 할 수 있는지 보기 위해서요
언급URL : https://stackoverflow.com/questions/127156/how-to-check-if-an-index-exists-on-a-table-field-in-mysql
'programing' 카테고리의 다른 글
JavaScript에서 페이지가 새로고침 또는 새로고침되는지 확인합니다. (0) | 2022.11.22 |
---|---|
Java에서의 MySQL 데이터 시간 및 타임스탬프 처리 (0) | 2022.11.22 |
JavaScript 변수 존재 여부 확인(정의/초기화) (0) | 2022.11.22 |
자바스크립트의 월과 날짜를 2자리 형식으로 가져오려면 어떻게 해야 하나요? (0) | 2022.11.21 |
PHP의 ::class란 무엇입니까? (0) | 2022.11.21 |