Thiết lập khóa ngoại trong phpMyAdmin?


335

Tôi đang thiết lập cơ sở dữ liệu bằng phpMyAdmin. Tôi có hai bảng ( foobar), được lập chỉ mục trên các khóa chính của chúng . Tôi đang cố gắng tạo một bảng quan hệ (foo_bar ) giữa chúng, sử dụng các khóa chính của chúng làm khóa ngoại.

Tôi đã tạo các bảng này là MyISAM, nhưng đã thay đổi cả ba bảng thành InnoDB, vì tôi đọc rằng MyISAM không hỗ trợ khóa ngoại. Tất cả các idlĩnh vực làINT(11) .

Khi tôi chọn foo_barbảng, hãy nhấp vào liên kết "chế độ xem quan hệ" và thử đặt các cột FK thành database.foo.iddatabase.bar.id, thông báo "Không xác định chỉ mục!"bên cạnh mỗi cột.

Tôi đang thiếu gì?

Làm rõ / Cập nhật

Để đơn giản, tôi muốn tiếp tục sử dụng phpMyAdmin. Tôi hiện đang sử dụng XAMPP, đủ dễ để tôi tập trung vào PHP / CSS / Javascript và nó đi kèm với phpMyAdmin.

Ngoài ra, mặc dù tôi chưa thể thiết lập các khóa ngoại rõ ràng, nhưng tôi có một bảng quan hệ và có thể thực hiện các phép nối như thế này:

SELECT * 
FROM foo 
INNER JOIN foo_bar 
ON foo.id = foo_bar.foo_id 
INNER JOIN bar
ON foo_bar.bar_id = bar.id;

Nó chỉ khiến tôi không thoải mái khi không có FK được xác định rõ ràng trong cơ sở dữ liệu.

Câu trả lời:


365

Nếu bạn muốn sử dụng phpMyAdmin để thiết lập quan hệ, bạn phải làm 2 việc. Trước hết, bạn phải xác định một chỉ mục trên cột khóa ngoại trong bảng tham chiếu (vì vậy foo_bar.foo_id, trong trường hợp của bạn). Sau đó, đi đến chế độ xem quan hệ (trong bảng tham chiếu) và chọn cột được giới thiệu (vì vậy trong trường hợp của bạn là foo.id) và cập nhật và các hành động xóa.

Tôi nghĩ rằng các khóa ngoại là hữu ích nếu bạn có nhiều bảng được liên kết với nhau, đặc biệt, các tập lệnh xóa của bạn sẽ trở nên rất ngắn nếu bạn đặt các tùy chọn tham chiếu chính xác.

EDIT: Đảm bảo cả hai bảng đều có công cụ InnoDB được chọn.


93
Mẹo: Chế độ xem mối quan hệ là liên kết nhỏ dưới bàn của bạn, thật khó để tôi tìm thấy nó ở vị trí đầu tiên
Mladen Janjetovic

14
Trừ khi liên kết đó không hiển thị ở đó, trong trường hợp đó: Đảm bảo bảng của bạn thuộc loại InnoDB (trong tab Hoạt động trong phpMyAdmin) để điều này không xảy ra.
muttley91

4
@ muttley91 Bảng của tôi là InnoDB. Tôi kiểm tra lại. Liên kết vẫn không hiển thị.
afilina

6
@afilina Trong phiên bản mới của phpMyAdmin, nó được hiển thị ở trên cùng bên trong tab "Cấu trúc", ngay bên dưới hàng tab hiển thị "Duyệt", "Cấu trúc", v.v.
Astitva Srivastava

225

phpMyAdmin cho phép bạn xác định khóa ngoại bằng cách sử dụng chế độ xem "quan hệ" của họ. Nhưng vì, MySQL chỉ hỗ trợ các ràng buộc nước ngoài trên các bảng "INNO DB", bước đầu tiên là đảm bảo các bảng bạn đang sử dụng thuộc loại đó.

Để thiết lập khóa ngoại sao cho cột PID trong bảng có tên CHILD tham chiếu cột ID trong bảng có tên PARENT, bạn có thể thực hiện các bước sau:

  1. Đối với cả hai bảng, hãy chuyển đến tab thao tác và thay đổi loại của chúng thành "INNO DB"
  2. Đảm bảo ID là khóa chính (hoặc ít nhất là một cột được lập chỉ mục) của bảng PARENT.
  3. Trong bảng CHILD, xác định một chỉ mục cho cột PID.
  4. Trong khi xem tab cấu trúc của bảng TRẺ, hãy nhấp vào liên kết "chế độ xem quan hệ" ngay phía trên phần "thêm trường".
  5. Bạn sẽ được cung cấp một bảng trong đó mỗi hàng tương ứng với một cột được lập chỉ mục trong bảng CLIENT của bạn. Việc thả xuống đầu tiên trong mỗi hàng cho phép bạn chọn TABLE-> COLUMN các tham chiếu cột được lập chỉ mục. Trong hàng cho PID, chọn PARENT-> ID từ danh sách thả xuống và nhấp GO.

Bằng cách thực hiện xuất trên bảng TRẺ, bạn sẽ thấy một ràng buộc khóa ngoài đã được tạo cho cột PID.


2
Wow, điều rất quan trọng cần biết. Trang này không phải là điều đầu tiên tôi tìm thấy khi tìm kiếm trợ giúp khi thêm khóa ngoại, tôi ước điều này được đề cập thường xuyên hơn.
dùng1299656

86

Đây là một bản tóm tắt của một bài viết Wikipedia. Nó chỉ định các loại mối quan hệ khác nhau mà bạn có thể quy định trong PHPmyadmin. Tôi đặt nó ở đây vì nó có liên quan đến nhận xét của @ Nathan về việc đặt các tùy chọn khóa ngoại cho "cập nhật / xóa" nhưng quá lớn cho một nhận xét - hy vọng nó có ích.

TRƯỜNG HỢP

Bất cứ khi nào các hàng trong bảng chính (được tham chiếu) bị xóa (cập nhật), các hàng tương ứng của bảng con (tham chiếu) có cột khóa ngoại phù hợp cũng sẽ bị xóa (cập nhật). Điều này được gọi là xóa tầng (cập nhật tương ứng [2]).

GIỚI HẠN

Không thể cập nhật hoặc xóa một giá trị khi một hàng tồn tại trong bảng khóa ngoại tham chiếu giá trị trong bảng được tham chiếu. Tương tự, một hàng không thể bị xóa miễn là có một tham chiếu đến nó từ bảng khóa ngoại.

KHÔNG CÓ HÀNH ĐỘNG

KHÔNG CÓ HÀNH ĐỘNG và GIỚI HẠN rất giống nhau. Sự khác biệt chính giữa KHÔNG HÀNH ĐỘNG và GIỚI HẠN là với KHÔNG CÓ HÀNH ĐỘNG, kiểm tra tính toàn vẹn tham chiếu được thực hiện sau khi thử thay đổi bảng. RESTRICT thực hiện kiểm tra trước khi thử thực hiện câu lệnh CẬP NHẬT hoặc XÓA. Cả hai hành động tham chiếu đều hoạt động như nhau nếu kiểm tra tính toàn vẹn tham chiếu không thành công: câu lệnh CẬP NHẬT hoặc XÓA sẽ dẫn đến lỗi.

THIẾT LẬP

Các giá trị khóa ngoài trong hàng tham chiếu được đặt thành NULL khi hàng được tham chiếu được cập nhật hoặc xóa. Điều này chỉ có thể nếu các cột tương ứng trong bảng tham chiếu là nullable. Do ngữ nghĩa của NULL, một hàng tham chiếu có NULL trong các cột khóa ngoại không yêu cầu một hàng được tham chiếu.

THIẾT BỊ DEFAULT

Tương tự như SET NULL, các giá trị khóa ngoài trong hàng tham chiếu được đặt thành mặc định của cột khi hàng được tham chiếu được cập nhật hoặc xóa.


1
Tốt hơn nữa, hãy truy cập trực tiếp vào tài liệu nguồn của MySQL: dev.mysql.com/doc/refman/5.6/en/create-table-forign-keys.html
kmoser

62

Trong phpmyadmin, bạn có thể gán Khóa ngoại đơn giản bằng GUI của nó. Nhấp vào bảng và đi đến tab Cấu trúc. tìm Chế độ xem quan hệ trên bảng dưới đây (hiển thị trong hình bên dưới).

nhập mô tả hình ảnh ở đây

Bạn có thể gán khóa rèn từ hộp danh sách gần bằng khóa chính. (Xem hình ảnh bên dưới). và lưu lại

nhập mô tả hình ảnh ở đây

truy vấn SQL tương ứng tự động được tạo và thực hiện.


16

Đối với những người mới sử dụng cơ sở dữ liệu .... và cần THAY ĐỔI một bảng hiện có. Rất nhiều thứ dường như khá đơn giản, nhưng luôn có một thứ gì đó ... giữa A và B.

Trước bất cứ điều gì khác, hãy xem điều này .

  1. Đảm bảo bạn có P_ID (ID cha trên cả bảng cha và con).
  2. Tất nhiên nó sẽ được điền vào phụ huynh. Không nhất thiết ở trẻ một cách chân thực và cuối cùng. Vì vậy, ví dụ P_ID # 3 (có thể nhiều lần trong bảng con sẽ được trỏ đến P_ID gốc ở bảng cha).
  3. Chuyển đến tab SQL (Tôi đang sử dụng phpMyAdmin, tương tự như các trang khác) và thực hiện lệnh này:

    ALTER TABLE child_table_name    
    ADD FOREIGN KEY (P_ID)   
    REFERENCES parent_table_name (P_ID)
  4. Nhấp vào bảng con, hơn cấu trúc, cuối cùng trên khung nhìn quan hệ. Kết thúc kế hoạch DB của bạn ở đó. Có một câu trả lời hay trước câu hỏi này về thác, hạn chế, v.v ... Tất nhiên nó có thể được thực hiện bằng các lệnh ...


9

Khóa ngoại có nghĩa là thuộc tính không nguyên tố của bảng tham chiếu thuộc tính nguyên tố của một * khác trong phpMyAdmin * trước tiên đặt cột bạn muốn đặt khóa ngoại làm chỉ mục

sau đó bấm vào QUAN HỆ QUAN TRỌNG

bạn có thể tìm thấy các tùy chọn để đặt khóa ngoại


7

InnoDB cho phép bạn thêm một ràng buộc khóa ngoại mới vào bảng bằng cách sử dụng ALTER TABLE:

ALTER TABLE tbl_name
    ADD [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

Mặt khác, nếu MyISAM có lợi thế hơn InnoDB trong ngữ cảnh của bạn, tại sao bạn lại muốn tạo các ràng buộc khóa ngoại. Bạn có thể xử lý việc này ở cấp độ mô hình của ứng dụng của bạn. Chỉ cần đảm bảo các cột mà bạn muốn sử dụng làm khóa ngoại được lập chỉ mục!


4
Các ràng buộc khóa ngoại giúp tôi tiết kiệm rất nhiều nỗ lực và các lỗi tiềm ẩn. Ví dụ: giả sử tôi sẽ xóa người dùng khỏi hệ thống của mình. Tôi có thể viết mã chỉ định mọi nơi trong cơ sở dữ liệu nơi dữ liệu về người dùng đó tồn tại và bảo nó xóa nó. Nhưng tôi phải luôn luôn cập nhật chức năng xóa đó. Mặt khác, nếu tất cả dữ liệu liên quan đến người dùng có FK đến ID người dùng và được đặt thành tầng khi xóa, tất cả mã của tôi phải nói là "xóa người dùng này" và cơ sở dữ liệu sẽ xử lý xóa mọi thứ có một tham chiếu FK cho người dùng đó. Sạch hơn nhiều để duy trì.
Nathan Long

1
@Nathan: Đó là những gì tôi đang nói trong bài viết. Bạn có thể xử lý nó ở cấp độ mô hình quá. Bạn có thể thực hiện xóa tầng từ mô hình.
markus

3
Bạn hầu như luôn luôn thêm tính toàn vẹn tham chiếu vào các bảng cơ sở dữ liệu của bạn. Cơ sở dữ liệu nên bảo vệ chính nó khỏi lập trình ứng dụng xấu. Đừng chỉ dựa vào ứng dụng của bạn để duy trì tính toàn vẹn dữ liệu. Tất nhiên luôn có ngoại lệ cho mọi quy tắc, nhưng tôi chưa tìm thấy quy tắc nào cho việc này.
Harvest

4

Đừng quên rằng hai cột phải có cùng kiểu dữ liệu.

ví dụ: nếu một cột thuộc kiểu INT và cột kia thuộc loại tinyint, bạn sẽ gặp phải lỗi sau:

Lỗi tạo khóa ngoại trên [cột PID] (kiểm tra loại dữ liệu)


3

Bước 1: Bạn phải thêm dòng: default-Storage-engine = InnoDB trong phần [mysqld] trong tệp cấu hình mysql của bạn (my.cnf hoặc my.ini tùy thuộc vào hệ điều hành của bạn) và khởi động lại dịch vụ mysqld. nhập mô tả hình ảnh ở đây

Bước 2: Bây giờ khi bạn tạo bảng bạn sẽ thấy loại bảng là: InnoDB

nhập mô tả hình ảnh ở đây

Bước 3: Tạo cả bảng Parent và Child. Bây giờ hãy mở bảng Con và chọn cột U muốn có Khóa ngoài: Chọn Khóa chỉ mục từ Nhãn hành động như bên dưới.

nhập mô tả hình ảnh ở đây

Bước 4: Bây giờ hãy mở Chế độ xem quan hệ trong cùng bảng con từ dưới lên gần Chế độ xem như hiển thị bên dưới.

nhập mô tả hình ảnh ở đây Bước 5: Chọn cột U muốn có khóa Ngoại như Chọn cột Cha từ trình đơn thả xuống. dbName.TableName.ColumnName

Chọn các giá trị phù hợp để BẬT XÓA và CẬP NHẬT nhập mô tả hình ảnh ở đây


2

Đầu tiên đặt Storage Engine là InnoDB

Đầu tiên đặt Storage Engine là InnoDB

sau đó tùy chọn xem quan hệ kích hoạt trong menu cấu trúc

sau đó tùy chọn xem quan hệ cho phép


Bước đầu tiên của bạn là chính xác nhưng những gì về tiếp theo xin vui lòng viết tất cả các quy trình từng bước.
kunal shaktaw

2

Đây là chủ đề cũ nhưng trả lời vì nếu hữu ích cho bất cứ ai.

Bước 1 . Công cụ lưu trữ Db của bạn được đặt thành InnoDB

Bước 2 . Tạo bảng chính

đây customerlà bảng chính và customer_idlà khóa chính

nhập mô tả hình ảnh ở đây

Bước 3 . tạo bảng khóa ngoại và đưa ra chỉ mục

Ở đây chúng tôi có customer_addressesbảng liên quan và lưu địa chỉ khách hàng, vì vậy ở đây customer_idliên quan đến customerbảng

chúng ta có thể chọn chỉ mục trực tiếp khi tạo bảng như dưới đây

nhập mô tả hình ảnh ở đây

Nếu bạn quên cung cấp chỉ mục khi tạo bảng , thì bạn có thể cung cấp chỉ mục từ tab cấu trúc của bảng như bên dưới.

nhập mô tả hình ảnh ở đây

Bước 4 . Khi chỉ mục cung cấp cho trường, Chuyển đến tab cấu trúc và nhấp vào Chế độ xem quan hệ như được hiển thị trong hình dưới đây

nhập mô tả hình ảnh ở đây

Bước 5 . Bây giờ, chọn BẬT XÓA và CẬP NHẬT những gì bạn muốn làm, Chọn cột từ bảng hiện tại, chọn DB (SAME DB), chọn bảng quan hệ và khóa chính từ bảng đó như trong hình bên dưới và Lưu

nhập mô tả hình ảnh ở đây

Bây giờ hãy kiểm tra xem mối quan hệ có được cung cấp thành công hay không, đi đến danh sách dữ liệu bảng nước ngoài và nhấp vào giá trị khóa ngoài, bạn sẽ chuyển hướng đến bản ghi bảng chính, sau đó quan hệ được thực hiện thành công.



0

Các phiên bản mới hơn của phpMyAdmin không còn tùy chọn " Quan hệ quan hệ " nữa, trong trường hợp đó bạn sẽ phải thực hiện một tuyên bố để đạt được điều tương tự. Ví dụ

ALTER TABLE employees
    ADD CONSTRAINT fk_companyid FOREIGN KEY (companyid)
    REFERENCES companies (id)
    ON DELETE CASCADE;

Trong ví dụ này, nếu một hàng từ các công ty bị xóa, tất cả nhân viên với công ty đó cũng sẽ bị xóa.

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.