Cách lấy khóa chính của bảng?


81

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

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

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

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

Câu trả lời:


135

Một cách tốt hơn là sử dụng SHOW KEYSvì không phải lúc nào bạn cũng có quyền truy cập vào information_schema. Các hoạt động sau:

SHOW KEYS FROM table WHERE Key_name = 'PRIMARY'

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


1
Gợi ý tốt. information_schema được hỗ trợ trên MySQL 5.0, nhưng thực sự thì phương pháp này cũng hoạt động với các phiên bản cũ hơn.
Roland Bouman

28
Có cách nào để chỉ lấy lại column_namechìa khóa không?
JDelage 14/02/12

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

34

Đây là tên cột khóa chính

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
vâng - đây là một cách. Trong trường hợp MySQL, thậm chí bạn có thể đơn giản hóa này, bởi vì constraint_name sẽ luôn luôn đượcPRIMARY
Roland Bouman

không muốn giới thiệu điều này chút nào, nó rất tài nguyên đòi hỏi câu trả lời của alexn nhanh hơn nhiều
Breezer

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 khác với tên bảng và id bảng và cố gắng tìm nạp từ đó, nếu nó không thể tìm thấy bảng, vì vậy nó thực hiện 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ư cũng thực sự tốt
Shir Gans

2
Nhưng giải pháp này hoạt động hiệu quả khi xử lý nhiều bảng. (Chỉ cần chọn 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
Chỉ cần một FYI, trên SQLServer , constraint_namevẻ thích UK_entity_name, PK_Users, FK_Users_Contactsvv, do đó nó không có vẻ nó có thể được tin cậy để có một giá trị nền tảng-agnostic nổi tiếng. 😞
Christian

1
Ái chà! Tôi không mong đợi bạn cập nhật nó. 😅 Ngoài một số thứ, nó hoạt động hoàn hảo! (Tôi đã cập nhật câu trả lời của bạn cho bạn với các bản sửa lỗi, hy vọng bạn không phiền)
Christian

@Christian cảm ơn vì đã theo dõi và chỉnh sửa nhanh chóng. nhiều nghĩa vụ!
Roland Bouman

7

sử dụng:

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

7

Còn cái này thì sao:

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): Unknown column 'db' trong 'mệnh đề where'
zloctb

1
@zloctb: Còn việc đổi tên dbbằng TABLE_SCHEMA của bạn ...? Tôi không hiểu lý do tại sao bạn có 1 về vấn đề này ...
Ludovic Guillaume

1
Đây là câu trả lời rõ ràng nhất và có tác dụng ngay với tôi.
Betty Mock

5

Nếu bạn muốn tạo danh sách các khóa chính động qua PHP trong một lần mà không cần phải chạy qua từng 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 phải có quyền truy cập vào information.schema để làm điều này.


2

Đối với 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";

vâng, gợi ý hay. mặc dù có giới hạn nhưng đây là mức đủ tốt cho các phím primaruy.
Roland Bouman

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

2

Mã ngắn nhất có thể có vẻ 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']; 

1

Cuối cùng thì tôi cũng hiểu rồi!

<?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

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


Bạn có thể vui lòng giải thích thêm câu trả lời của mình bằng cách thêm một chút mô tả về giải pháp bạn cung cấp không?
abarisone

0

MySQL có một truy vấn SQL "SHOW INDEX FROM" trả về các chỉ mục từ một bảng. Ví dụ. - truy vấn sau sẽ hiển thị tất cả các chỉ mục cho bảng sản phẩm: -

SHOW INDEXES FROM products \G

Nó trả về một bảng có type, column_name, Key_name, v.v. và hiển thị đầu ra với tất cả các chỉ mục và khóa chính dưới dạng:

*************************** 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ừ bảng, hãy sử dụng: -

SHOW INDEXES FROM table_name WHERE Key_name = 'PRIMARY'

Cân nhắc thêm lời giải thích tại sao điều này trả lời câu hỏi ban đầu.
Olivier De Meulder

0

Nếu bạn có các bảng không gian trong cơ sở dữ liệu của mình, hãy sử dụng:

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

0

Bạn nên sử dụng CHÍNH từ key_column_usage.constraint_name = "PRIMARY"

truy vấn mẫu,

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%'

Tôi khuyên bạn nên xem tất cả các lĩnh vực

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.