2011-10-14 56 views
6

Tôi có cơ sở dữ liệu mà tôi cần phải bỏ một số khóa ngoại, nhưng tôi không biết trước liệu các khóa ngoại vẫn còn tồn tại hay không.Truy vấn để tìm khóa ngoài

Tôi đã tìm thấy một số thủ tục được lưu trữ (http://forums.mysql.com/read.php?97,218825,247526) thực hiện thủ thuật, nhưng tôi không muốn tạo một quy trình được lưu trữ cho việc này.

Tôi đã cố gắng sử dụng các truy vấn bên trong thủ tục lưu trữ, nhưng tôi nhận được một lỗi sử dụng "nếu có (SELECT NULL TỪ vv .. vv ...

Tôi có thể chỉ sử dụng IF EXISTS trong thủ tục lưu trữ?


ngay bây giờ, điều duy nhất tôi có thể chạy là

SELECT * FROM information_schema.TABLE_CONSTRAINTS 
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY' 
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema' 
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable'; 

và tôi đã cố gắng này quá

IF EXISTS (SELECT NULL FROM information_schema.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = DATABASE() AND CONSTRAINT_NAME = parm_key_name) THEN 
(...) do something (...) 
END IF; 

nhưng tôi nhận được một You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF' at line 1

Tôi đã nhìn các ví dụ trên các diễn đàn với các truy vấn đơn giản và tôi không thể làm cho cảm giác tại sao điều này không hoạt động.

LƯU Ý: Chỉnh sửa để sửa chữa gãy liên kết

+1

Vậy truy vấn của bạn trông như thế nào? –

+0

Cụ thể bạn có ý nghĩa gì khi "thả chìa khóa nước ngoài"? – gview

+0

@ gview một cái gì đó như ALTER TABLE 'table' DROP NGOẠI KEY' fk'; –

Trả lời

5

Bạn cần phải kết nối với các chương trình thông tin và bạn có thể tìm thấy tất cả các thông tin về các khóa chính và khóa ngoại trong bảng này

SELECT * FROM information_schema.TABLE_CONSTRAINTS T;

bạn cần phải là người dùng ROOT để truy cập information_schema.

SỬ DỤNG bảng này, bạn có thể tìm thấy bảng, db và liệu nó có khóa ngoại hay không.

Hy vọng điều này sẽ giúp ích nếu bạn không muốn sử dụng IF EXIST và Thủ tục được lưu trữ. Nhưng tôi chắc chắn bạn có thể sử dụng IF EXIST có thể được sử dụng cho các truy vấn thủ tục không được lưu trữ ....

+0

"[Y] ou cần phải là người dùng ROOT để truy cập vào information_schema." Bạn đã tìm thấy thông tin này ở đâu? – rstackhouse

+0

Tôi nghĩ rằng chính xác hơn khi nói rằng người dùng chỉ có thể xem một phần lược đồ thông tin mà họ có quyền truy cập. Nếu người dùng được tạo bằng 'GRANT ALL' thì họ có thể thấy các quyền trên bảng đó. – rstackhouse

1

Tại sao bạn không sử dụng bảng "INFORMATION_SCHEMA" này?

SELECT * 
FROM `TABLE_CONSTRAINTS` 
WHERE `CONSTRAINT_TYPE` = 'FOREIGN KEY' 
0

Bạn cần phải kết nối với các chương trình thông tin và bạn có thể tìm thấy tất cả các thông tin về các khóa chính và khóa ngoại trong bảng này

select 
     concat(table_name, '.', column_name) as 'foreign key', 
     concat(referenced_table_name, '.', referenced_column_name) as 'references' 
    from 
     information_schema.key_column_usage 
    where 
     referenced_table_name is not null; 

TRỢ GIÚP: xem liên kết này list-foreign-keys-in-mysql

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