テーブルの主キーを取得する方法は?


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はMySQL5.0以降でサポートされていますが、実際、このメソッドは古いバージョンでも機能します。
Roland Bouman 2010

28
column_nameキーのみを取得する方法はありますか?
jDelage 2012

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
はい-これは1つの方法です。MySQLの場合、constraint_nameは常に次のようになるため、これを単純化することもできますPRIMARY
Roland Bouman

それは非常にalexnの答えを必要とするリソースのすべてにこれをお勧めwouldntのは、はるかに高速です
ブリーザ

ええ、このクエリには長い時間がかかります。私がしたことは、テーブル名とテーブルIDを持つ別のテーブルであり、テーブルが見つからない場合はそこからフェッチしようとしているため、この長いクエリを作成して新しいテーブルに追加すると、はるかに高速に動作します。しかし、alexnの答えも本当に良いようです
Shir Gans

2
ただし、このソリューションは、複数のテーブルを処理する場合に最適です。(k.table_name、k.column_name、k.ordinal_positionを選択するだけです)。
クラウス

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
ちょうどFYI、上のSQLServerconstraint_nameのように見えるUK_entity_namePK_UsersFK_Users_Contactsなど、それはよく知られているプラットフォームに依存しない値を持つように信頼することができていないようです。😞–
クリスチャン

1
うわあ!私はあなたがそれを更新することを期待していませんでした。😅いくつかのことを除いて、それは完璧に機能します!(私はあなたのためにあなたの答えを修正で更新しました、あなたが気にしないことを願っています)
クリスチャン

@Christianは、迅速なフォローアップと修正に感謝します。とても感謝しております!
RolandBouman20年

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
エラー1054(42S22):「where句」の不明な列「db」
zloctb 2014

1
@zloctb:dbTABLE_SCHEMAによる名前の変更はどうですか...?あなたがこの上で+1を得た私はなぜ...理解していない
ルドビクギョーム

1
これは最も明確な答えであり、すぐに私のために働きました。
ベティモック2014

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";

うん、良い提案。制限はありますが、これはprimaruyキーには十分です。
Roland Bouman 2010

質問者はPHPと言いました。
arleslie 2014年

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 INDEXFROMテーブルを使用します; それは私にたくさんの情報を与えてくれます; キーが一意の場合、インデックス内のシーケンス、照合順序、サブパーツ、nullの場合、タイプとコメントが存在する場合は、こちらのスクリーンショットを参照してくださいここに


提供するソリューションについてもう少し説明を追加して、回答を詳しく説明していただけますか?
abarisone 2015

0

MySQLには、テーブルからインデックスを返すSQLクエリ「SHOWINDEXFROM」があります。例えば。-次のクエリは、productsテーブルのすべてのインデックスを表示します。-

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.