테이블의 기본 키를 얻는 방법은 무엇입니까?


81

mysql-database에서 기본 키 필드의 이름을 얻는 방법이 있습니까? 예를 들면 :

다음과 같은 테이블이 있습니다.

+----+------+
| id | name |
+----+------+
| 1  | Foo1 |
| 2  | Foo2 |
| 3  | Foo3 |
+----+------+

필드 ID가 기본 키인 경우 (자동 증가가 있지만 사용할 수 없습니다). PHP에서 필드 이름 "id"를 어떻게 검색 할 수 있습니까?

답변:


135

더 좋은 방법은 SHOW KEYSinformation_schema에 항상 액세스 할 수있는 것은 아니기 때문에 사용하는 것입니다 . 다음 작업 :

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY'

Column_name에는 기본 키의 이름이 포함됩니다.


1
좋은 제안입니다. information_schema는 MySQL 5.0부터 지원되지만 실제로이 방법은 이전 버전에서도 작동합니다.
Roland Bouman

28
column_name키만 검색 할 수있는 방법이 있습니까?
JDelage

cut열 이름 만 얻으려면 사용 하십시오.`| cut -f5`
whoan

34

다음은 기본 키 열 이름입니다.

SELECT k.column_name
FROM information_schema.table_constraints t
JOIN information_schema.key_column_usage k
USING(constraint_name,table_schema,table_name)
WHERE t.constraint_type='PRIMARY KEY'
  AND t.table_schema='YourDatabase'
  AND t.table_name='YourTable';

3
예-이것은 한 가지 방법입니다. constraint_name을 항상되기 때문에 MySQL의 경우, 당신은이를 단순화 할 수 있습니다PRIMARY
롤랜드 보우만

전혀 추천하지 않을 것입니다 그것은 alexn의 대답을 요구하는 매우 자원이 훨씬 더 빠릅니다
Breezer

예,이 쿼리는 시간이 오래 걸립니다. 내가 한 것은 테이블 이름과 테이블 ID가있는 또 다른 테이블이며 테이블을 찾을 수없는 경우 거기에서 가져 오려고하므로이 긴 쿼리를 만들고 새 테이블에 추가하면 훨씬 빠르게 작동합니다. 하지만 alexn 답변도 정말 좋은 것 같습니다
Shir Gans

2
그러나이 솔루션은 여러 테이블을 다룰 때 효과적입니다. (k.table_name, k.column_name, k.ordinal_position을 선택하기 만하면됩니다).
Claus,

21
SELECT kcu.column_name, kcu.ordinal_position
FROM   information_schema.table_constraints tc
INNER JOIN information_schema.key_column_usage kcu
ON     tc.CONSTRAINT_CATALOG = kcu.CONSTRAINT_CATALOG
AND    tc.CONSTRAINT_SCHEMA = kcu.CONSTRAINT_SCHEMA
AND    tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE  tc.table_schema = schema()             -- only look in the current schema
AND    tc.constraint_type = 'PRIMARY KEY'
AND    tc.table_name = '<your-table-name>'    -- specify your table.
ORDER BY kcu.ordinal_position

1
그냥은 참고에 SQLSERVER , constraint_name외모 좋아 UK_entity_name, PK_Users, FK_Users_Contacts등,이 잘 알려진 멀티 플랫폼 값이 신뢰할 수있는 보이지 않도록. 😞
기독교

1
우와! 업데이트를 기대하지 않았습니다. 😅 몇 가지 외에는 완벽하게 작동합니다! (수정 사항으로 답변을 업데이트
Christian

@Christian은 빠른 후속 조치 및 수정을 위해 감사드립니다. 감사합니다!
Roland Bouman

7

사용하다:

show columns from tablename where `Key` = "PRI";

7

이것은 어떤가요:

SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'Your Database'
  AND TABLE_NAME = 'Your Table name'
  AND COLUMN_KEY = 'PRI';


SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'Your Database'
  AND TABLE_NAME = 'Your Table name'
  AND COLUMN_KEY = 'UNI';

1
ERROR 1054 (42S22) : 알 수없는 열 'DB' 'where 절'에서
zloctb

1
@zloctb : dbTABLE_SCHEMA로 이름을 바꾸는 것은 어떻습니까 ...? 이에 일을 가지고 왜 ... 이해가 안 돼요
루도빅 기욤에게

1
이것은 가장 명확한 답변이었고 즉시 나를 위해 일했습니다.
Betty Mock

5

각 테이블을 실행할 필요없이 PHP를 통해 동적으로 기본 키 목록을 생성하려면 다음을 사용할 수 있습니다.

SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.key_column_usage 
WHERE table_schema = '$database_name' AND CONSTRAINT_NAME = 'PRIMARY' 

이렇게하려면 information.schema에 대한 액세스 권한이 있어야합니다.


2

PHP 접근 방식의 경우 mysql_field_flags 를 사용할 수 있습니다.

$q = mysql_query('select * from table limit 1');

for($i = 0; $i < mysql_num_fields(); $i++)
    if(strpos(mysql_field_tags($q, $i), 'primary_key') !== false)
        echo mysql_field_name($q, $i)." is a primary key\n";

네, 좋은 제안입니다. 제한적이지만 이것은 기본 키에 충분합니다.
Roland Bouman

질문자는 PHP라고 말했습니다.
arleslie

2

가능한 가장 짧은 코드는 다음과 같습니다.

// $dblink contain database login details 
// $tblName the current table name 
$r = mysqli_fetch_assoc(mysqli_query($dblink, "SHOW KEYS FROM $tblName WHERE Key_name = 'PRIMARY'")); 
$iColName = $r['Column_name']; 

1

드디어 찾았습니다!

<?php

function mysql_get_prim_key($table){
$sql = "SHOW INDEX FROM $table WHERE Key_name = 'PRIMARY'";
$gp = mysql_query($sql);
$cgp = mysql_num_rows($gp);
if($cgp > 0){
// Note I'm not using a while loop because I never use more than one prim key column
$agp = mysql_fetch_array($gp);
extract($agp);
return($Column_name);
}else{
return(false);
}
}

?>

0

나는 SHOW INDEX FROM table을 사용한다. 그것은 나에게 많은 정보를 제공합니다; 키가 고유 한 경우 인덱스의 시퀀스, 데이터 정렬, 하위 부분, null 인 경우 해당 유형 및 주석이있는 경우 여기에서 스크린 샷을 참조하세요.여기


제공하는 솔루션에 대한 설명을 추가하여 답변을 더 자세히 설명해 주시겠습니까?
abarisone 2015

0

MySQL에는 테이블에서 인덱스를 반환하는 SQL 쿼리 "SHOW INDEX FROM"이 있습니다. 예를 들어. -다음 쿼리는 제품 테이블의 모든 인덱스를 표시합니다.

SHOW INDEXES FROM products \G

type, column_name, Key_name 등의 테이블을 반환하고 모든 인덱스와 기본 키가있는 출력을-

*************************** 1. row ***************************
        Table: products
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: product_id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 

테이블에서 기본 키를 표시하려면 다음을 사용하십시오.

SHOW INDEXES FROM table_name WHERE Key_name = 'PRIMARY'

이것이 원래 질문에 답하는 이유에 대한 설명을 추가하는 것을 고려하십시오.
Olivier De Meulder 2016

0

데이터베이스에 공간 테이블이있는 경우 다음을 사용하십시오.

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY' OR Key_name = 'OGR_FID'

0

PRIMARY를 사용해야합니다. key_column_usage.constraint_name = "PRIMARY"

샘플 쿼리,

SELECT k.column_name as PK, concat(tbl.TABLE_SCHEMA, '.`', tbl.TABLE_NAME, '`') as TABLE_NAME
FROM information_schema.TABLES tbl
JOIN information_schema.key_column_usage k on k.table_name = tbl.table_name
WHERE k.constraint_name='PRIMARY'
  AND tbl.table_schema='MYDB'
  AND tbl.table_type="BASE TABLE";

0
SELECT k.column_name
FROM information_schema.key_column_usage k   
WHERE k.table_name = 'YOUR TABLE NAME' AND k.constraint_name LIKE 'pk%'

나는 당신이 모든 필드를 볼 것을 추천합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.