2008-11-17 33 views
6

Tôi đang tạo một bảng mới bên trong mysql và tôi đang cố gắng thêm ràng buộc khóa ngoài vào một trong các trường.Biến mất các khoá ngoại trong phpMyAdmin

 
CREATE TABLE `onlineorder` (
    `receiptid` varchar(10) NOT NULL default '', 
    `delivereddate` date default NULL, 
    `cid` int(10) NOT NULL, 
    `card#` int(10) default NULL, 
    `expire` date default NULL, 
    PRIMARY KEY (`receiptid`), 
    FOREIGN KEY (receiptid) REFERENCES purchase 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Tuy nhiên, sau khi tạo, tôi vào phpMyAdmin và xuất bảng. và có vẻ như ràng buộc khoá ngoại đã biến mất.

 
CREATE TABLE `onlineorder` (
    `receiptid` varchar(10) NOT NULL default '', 
    `delivereddate` date default NULL, 
    `cid` int(10) NOT NULL, 
    `card#` int(10) default NULL, 
    `expire` date default NULL, 
    PRIMARY KEY (`receiptid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

Có phpMyAdmin loại bỏ các khóa lạ hoặc tôi đang làm điều gì sai ở đây không?

Trả lời

6

Khi bạn định nghĩa một bảng với các công cụ lưu trữ MyISAM, nó chấp nhận FOREIGN KEY trở ngại, nhưng nó âm thầm ném chúng đi. Nó phân tích chúng, nhưng không lưu trữ ràng buộc trong siêu dữ liệu bảng, và sau đó không thể thực thi ràng buộc. Khi bạn yêu cầu xem xét ý tưởng về định nghĩa bảng của cơ sở dữ liệu, nó không biết gì về ràng buộc đó, như bạn đã phát hiện ra.

Điều tương tự cũng xảy ra với các ràng buộc CHECK (bất kể công cụ lưu trữ); nó phân tích cú pháp và chấp nhận cú pháp, nhưng sau đó bỏ qua nó.

IMHO, đây là điều khủng khiếp đối với sản phẩm MySQL cần thực hiện. Nó chấp nhận SQL tiêu chuẩn không có lỗi, để lại cho bạn ấn tượng rằng nó sẽ hỗ trợ ràng buộc theo cách tiêu chuẩn. Nhưng nó không! Thậm chí không SHOW WARNINGS cho thấy rằng MySQL đã bỏ qua những hạn chế.

Nếu bạn sử dụng công cụ lưu trữ InnoDB, nó lưu ý ràng buộc khóa ngoài.

+1

ngay cả với InnoDB việc xuất khẩu không bao gồm phím nước ngoài. (đối với tôi) – sdfor

+2

ok Tôi đã tìm ra. dưới quan điểm quan hệ, tôi đã thêm khóa foriegn vào cột quan hệ nội bộ. lỗi của tôi. nó sẽ được nhập vào cột tiếp theo. – sdfor

+0

Đồng ý, đó là một cách khủng khiếp để mã hóa nó. –

1

Ngoài ra, PHPMyAdmin sẽ loại bỏ bất kỳ phần mềm CONSTRAINTS nào cho đến khi tất cả các bảng đã được tạo và dữ liệu đã được chèn vào. Nếu bạn sử dụng như PHPMySql để đổ bảng cho bạn, bạn sẽ tìm thấy ở cuối tập tin một phần bảng UPDATE với tất cả các mục ADD CONSTRAINT của bạn.

0

Có hai loại hạn chế khi bạn quản lý bảng của bạn với phpmyadmin:

  • nội bộ: khi bạn thiết lập các ràng buộc với nhà thiết kế phpmyadmin ví dụ như hạn chế lưu trữ như nội bộ, điều đó sẽ không được đưa vào xuất khẩu.
  • InnoDB: những khó khăn này bao gồm trong tầm kiểm soát xuất khẩu ra liên kết video về nó

[Video: Thiết lập một ràng buộc khoá ngoại] [1]

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