2010-02-10 28 views

Trả lời

98

Trong MySQL, không cần đặt tên biểu tượng cho các ràng buộc khóa ngoài. Nếu tên không được cung cấp, InnoDB sẽ tự động tạo một tên duy nhất.

Trong mọi trường hợp, đây là quy ước mà tôi sử dụng:

fk_[referencing table name]_[referenced table name]_[referencing field name] 

Ví dụ:

CREATE TABLE users(
    user_id int, 
    name  varchar(100) 
); 

CREATE TABLE messages(
    message_id int, 
    user_id int 
); 

ALTER TABLE messages ADD CONSTRAINT fk_messages_users_user_id 
    FOREIGN KEY (user_id) REFERENCES users(user_id); 

tôi cố gắng gắn bó với tên trường cùng tham khảo và bảng tham chiếu, như trong user_id trong ví dụ trên. Khi điều này là không thực tế, tôi cũng nối thêm tên trường được tham chiếu vào tên khóa ngoài.

Quy ước đặt tên này cho phép tôi "đoán" tên biểu tượng chỉ bằng cách xem các định nghĩa bảng và ngoài ra nó cũng đảm bảo các tên duy nhất.

+13

Lý do tạo một tên tượng trưng là để tham chiếu khi bạn muốn/cần phải bỏ ràng buộc. Oracle & SQL Server cho phép bạn vô hiệu hóa các ràng buộc cụ thể. Nếu bạn không có fk trong tên, bạn phải xác nhận ràng buộc là một ràng buộc khoá ngoại ... –

+9

Điều tôi muốn làm là sử dụng dấu gạch dưới kép giữa tên bảng tham chiếu và tên bảng được tham chiếu. Điều này mang lại cho bạn những lợi thế kép của danh sách theo thứ tự chữ cái giữ tất cả các FK của bảng cùng nhau và đồng thời giúp bạn tránh va chạm tên/nhầm lẫn khi có nhiều tên bảng từ. Tôi cũng bỏ qua phần trường của tên khi nó là tầm thường (nghĩa là một trường int đơn tham chiếu đến danh tính PK của một bảng khác). –

+2

Điều gì xảy ra nếu có nhiều hơn 1 khóa ngoại? Ví dụ: 'member_id' ~> liên kết đến thành viên bảng,' edit_id' ~> khóa ngoại cho người dùng đã chỉnh sửa, cũng liên kết đến thành viên bảng. Làm thế nào tôi nên đặt tên cho họ? – TomSawyer

22

lựa chọn của tôi là khác nhau. theo ý kiến ​​của tôi, một bảng cần phải có một "id" lĩnh vực, không phải là một "user_id" một, vì bảng chỉ được gọi là "người sử dụng", vì vậy:

CREATE TABLE users(
    id int, 
    name  varchar(100) 
); 

CREATE TABLE messages(
    id int, 
    user_id int 
); 

"user_id" trong "thông điệp" bảng là một fk lĩnh vực vì vậy nó đã làm cho rõ ràng mà id là ("user_id").

một quy ước đặt tên đầy đủ tự giải thích, theo ý kiến ​​của tôi, có thể là:

fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name] 

i.e.: fk_messages_user_id_users_id 

lưu ý:

  • bạn có thể, trong một số trường hợp, bỏ qua các yếu tố thứ hai ([tham khảo lĩnh vực name])
  • fk này có thể là duy nhất, vì nếu bảng "messages_user" tồn tại, tên trường tham chiếu phải là "user_id" (và không chỉ "id") và tên fk phải là:

    fk_messages_user_user_id_users_id

nói cách khác, một quy ước đặt tên chính nước ngoài làm cho bạn chắc chắn về tên duy nhất nếu bạn cũng sử dụng một "tham khảo/lĩnh vực tham chiếu" quy ước đặt tên (và bạn có thể chọn riêng của bạn, tất nhiên) .

7

Nếu bạn không thấy mình tham chiếu fk thường xuyên sau khi chúng được tạo, một tùy chọn là giữ cho nó đơn giản và để MySQL đặt tên cho bạn (như Daniel Vassallo mentions in the beginning of his answer).

Trong khi bạn sẽ không thể duy nhất "đoán" những cái tên khó khăn với phương pháp này - bạn có thể dễ dàng tìm ra tên ràng buộc khoá ngoại bằng cách chạy một truy vấn:

use information_schema; 
select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from KEY_COLUMN_USAGE where REFERENCED_TABLE_SCHEMA = 'your_db_schema_name' ORDER BY TABLE_NAME; 

Ví dụ, bạn có thể nhận được sau truy vấn:

+------------+-------------+-----------------+-----------------------+------------------------+ 
| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME | 
+------------+-------------+-----------------+-----------------------+------------------------+ 
| note  | taskid  | note_ibfk_2  | task     | id      | 
| note  | userid  | note_ibfk_1  | user     | id      | 
| task  | userid  | task_ibfk_1  | user     | id      | 
+------------+-------------+-----------------+-----------------------+------------------------+ 

Nếu bước bổ sung này không quá nhiều cho bạn, bạn có thể dễ dàng tìm thấy fk bạn đang tìm kiếm.

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