2010-02-26 11 views
44

Có cách nào để lấy tên trường khóa chính từ cơ sở dữ liệu mysql không? Ví dụ:Lấy khóa chính của bảng?

Tôi có một bảng như thế này:

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

đâu id lĩnh vực là khóa chính (nó có tự động tăng nhưng tôi không thể sử dụng). Làm thế nào tôi có thể lấy tên trường "id" trong php?

Trả lời

83

Cách tốt hơn là sử dụng SHOW KEYS vì bạn không luôn luôn có quyền truy cập vào information_schema. Các công trình sau:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY' 

Tên cột sẽ chứa tên của khóa chính.

+1

Đề xuất tốt. information_schema được hỗ trợ như của MySQL 5.0, nhưng thực sự phương pháp này hoạt động cho các phiên bản cũ hơn. –

+17

Có cách nào để chỉ truy xuất khóa 'column_name' không? – JDelage

+0

sử dụng 'cut' nếu bạn muốn lấy tên cột:' | cut -f5' – whoan

20

Đây là Primary key Tên cột

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'; 
+0

vâng - đây là một cách.Trong trường hợp MySQL, bạn thậm chí có thể đơn giản hóa điều này, bởi vì các constraint_name sẽ luôn luôn là 'PRIMARY' –

+0

sẽ không đề nghị điều này ở tất cả, nó rất cần tài nguyên. Câu trả lời của alexn nhanh hơn rất nhiều – Breezer

+0

vâng, truy vấn này mất nhiều thời gian. những gì tôi đã làm là một bảng với tên bảng và id bảng và cố gắng lấy từ đó, nếu nó không thể tìm thấy bảng, do đó, nó làm cho truy vấn dài này và thêm nó vào bảng mới, hoạt động nhanh hơn nhiều. nhưng câu trả lời alexn dường như thực sự tốt quá –

10
SELECT kcu.column_name 
FROM information_schema.key_column_usage 
WHERE table_schema = schema()    -- only look in the current db 
AND constraint_name = 'PRIMARY'   -- always 'PRIMARY' for PRIMARY KEY constraints 
AND table_name = '<your-table-name>' -- specify your table. 
2

Đối với một cách tiếp cận PHP, bạn có thể sử dụng 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"; 
+0

yup, gợi ý tốt. mặc dù có giới hạn, điều này là đủ tốt cho các khóa primaruy. –

+0

Người hỏi đã nói PHP. – arleslie

1

Tôi đã có nó, cuối cùng!

<?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); 
} 
} 

?> 
5

Làm thế nào về điều này.

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): Cột không xác định 'db' trong 'where khoản' – zloctb

+0

@zloctb: Còn đổi tên 'db' bằng TABLE_SCHEMA của bạn ... thì sao? Tôi không hiểu tại sao bạn có +1 về điều này ... –

+0

Đây là câu trả lời rõ ràng nhất và làm việc ngay lập tức cho tôi. –

1

mã ngắn nhất có thể có vẻ là một cái gì đó giống như

// $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']; 
5

sử dụng:

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

Nếu bạn muốn tạo danh sách các từ khóa chính tự động qua php trong một đi mà không cần phải chạy qua mỗi bảng, bạn có thể sử dụng

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

mặc dù bạn cần truy cập vào information.schema để thực hiện việc này.

0

Tôi sử dụng bảng SHOW INDEX FROM; nó mang lại cho tôi rất nhiều thông tin; nếu khóa là duy nhất, phần tiếp theo của nó trong chỉ mục, đối chiếu, phần phụ, nếu null, loại và nhận xét của nó nếu tồn tại, hãy xem ảnh chụp màn hình tại đây here

+0

Bạn có thể vui lòng xây dựng thêm câu trả lời của bạn thêm mô tả chi tiết hơn về giải pháp bạn cung cấp không? – abarisone

0

MySQL có truy vấn SQL "HIỂN THỊ INDEX FROM". từ một cái bàn. Ví dụ: - truy vấn sau đây sẽ hiển thị tất cả các chỉ số cho bảng các sản phẩm: -

SHOW INDEXES FROM products \G 

Nó trả về một bảng với loại, column_name, KEY_NAME, vv và sản lượng hiển thị với tất cả các chỉ số và khóa chính như -

*************************** 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: 

Để chỉ hiển thị khóa chính từ việc sử dụng bảng: -

SHOW INDEXES FROM table_name WHERE Key_name = 'PRIMARY' 
+0

Cân nhắc thêm giải thích về lý do tại sao câu trả lời này trả lời câu hỏi gốc. –