2009-05-21 39 views
19

tôi, tạo ra một truy vấn SQL như thế này trong PHP:MySQL: Xác định Primary Key động Bảng của

$sql = sprintf("UPDATE %s SET %s = %s WHERE %s = %s", ...); 

Kể từ khi hầu hết các phần của truy vấn này là năng động, tôi cần một cách để xác định khóa chính của bảng động , để tôi có một truy vấn như thế này:

$sql = sprintf("UPDATE %s SET %s=%s WHERE PRIMARY_KEY = %s", ...); 

Có từ khóa MySQL cho khóa chính của bảng hay cách để lấy nó?

Tôi đã sử dụng DB information_schema trước để tìm thông tin như thế này, nhưng nó muốn được tốt đẹp nếu tôi không phải nghỉ mát để đó.

Trả lời

31
SHOW INDEX FROM <tablename> 

Bạn muốn hàng nơi KEY_NAME = TIỂU

http://dev.mysql.com/doc/refman/5.0/en/show-index.html

Bạn có lẽ sẽ muốn cache kết quả - phải mất một thời gian để chạy HIỂN THỊ báo cáo trên tất cả các bảng bạn có thể cần để làm việc với.

+14

Cảm ơn, đó là rất tốt . Tôi đã sử dụng điều này: TỪ CHỐI TỪ WHERE Key_name = 'PRIMARY' – macinjosh

+1

Điều này trả về hàng đầy đủ ... nếu bạn chỉ muốn tên cột, hãy xem câu trả lời của Jake Sully bên dưới. – Andrew

+0

Khi chàng người đã viết câu trả lời này, tôi phải đồng ý: câu trả lời Jake Sully là tốt nhất cho đến nay. @macinjosh Tôi khuyên bạn nên bỏ chấp nhận câu trả lời của tôi và chấp nhận câu trả lời của Jake. –

20

Nó có thể không được khuyến cáo nhưng chỉ hoạt động tốt:

SHOW INDEX FROM <table_name> WHERE Key_name = 'PRIMARY'; 

Cách rắn là sử dụng information_schema:

SELECT k.COLUMN_NAME 
FROM information_schema.table_constraints t 
LEFT JOIN information_schema.key_column_usage k 
USING(constraint_name,table_schema,table_name) 
WHERE t.constraint_type='PRIMARY KEY' 
    AND t.table_schema=DATABASE() 
    AND t.table_name='owalog'; 

Như đã trình bày trên mysql-list. Tuy nhiên nó chậm hơn một vài lần so với giải pháp đầu tiên.

+0

Hi, Tôi biết đây là một bài cũ nhưng tôi chỉ muốn hỏi tại sao bạn nói phương pháp đầu tiên là không đúng đắn. Câu trả lời được chấp nhận từ [câu hỏi trùng lặp này] (https://stackoverflow.com/questions/2341278/php-get-primary-key-of-table) nói rằng bạn không phải lúc nào có quyền truy cập vào information_schema nên nó cho thấy là người đầu tiên phương pháp.Thêm vào đó bạn nói rằng phương pháp thứ hai chậm hơn vài lần so với giải pháp đầu tiên. Nếu đúng như vậy, tại sao phương pháp thứ hai lại vững chắc? Cảm ơn. –

+0

Như được chỉ ra trong http://mysql-0v34c10ck.blogspot.com/2011/05/better-way-to-get-primary-key-columns.html nó không thể được sử dụng như biến mysql hoặc suy nghĩ xem vv nhưng nếu trường hợp đầu tiên hoạt động trong kịch bản của bạn, hãy truy cập vào @Andrew – lukmdo

0

Cũng

SHOW INDEX FROM <table_name> WHERE Key_name = 'PRIMARY'; 

là tương đương với

SHOW KEYS FROM <table_name> WHERE Key_name = 'PRIMARY'; 

enter image description here

0

Dựa trên @ jake-Sully và @lukmdo câu trả lời, làm việc kết hợp với mã của họ, tôi kết thúc với đoạn mã sau:

SELECT `COLUMN_NAME` 
FROM `information_schema`.`COLUMNS` 
WHERE (`TABLE_SCHEMA` = DATABASE()) 
AND (`TABLE_NAME` = '<tablename>') 
AND (`COLUMN_KEY` = 'PRI'); 

Hy vọng nó có thể giúp một người nào đó

Các vấn đề liên quan