phpMyAdmin
 sql >> Cơ Sở Dữ Liệu >  >> Database Tools >> phpMyAdmin

Cách thiết lập mối quan hệ giữa các bảng trong phpMyAdmin

Ràng buộc khóa ngoại table2 có nghĩa là bất kỳ giá trị nào của table2 customerId phải xuất hiện dưới dạng customerId trong table1. Bạn gặp phải lỗi vì bạn đang chèn một customerID vào table2 mà không xuất hiện trong table1.

Vì DBMS đang tạo ra các customerID của table1 bằng cách tăng tự động, nếu bạn chèn một hàng, bạn phải lấy giá trị đó để chèn một hàng bằng customerID đó vào table2.

Tôi đoán bạn nói "Tôi đã thiết lập mối quan hệ giữa table1 và table2" có nghĩa là "Tôi đã khai báo ràng buộc khóa ngoại". Và tôi đoán bạn nghĩ điều đó có nghĩa là "sau khi tôi chèn vào table1, DBMS sẽ sử dụng giá trị khóa được tạo tự động làm giá trị khóa ngoại khi tôi chèn vào table2". Nhưng nó không có nghĩa là như vậy. Bạn phải tự mình làm điều đó. Ràng buộc khóa ngoài chỉ có nghĩa là DBMS kiểm tra xem mọi giá trị của table2 customerId có xuất hiện dưới dạng giá trị của table1 customerId hay không.

Bạn có thể và phải sử dụng bất kỳ giá trị khóa nào đã chèn trước đó làm giá trị tương ứng khi bạn chèn vào bảng có khóa ngoại cho khóa đó.

Để lấy lại giá trị khóa tăng dần tự động do DBMS tạo ra, hãy sử dụng LAST_INSERT_ID () :

INSERT INTO table1 (CustomerName,Address,State)
VALUES('value1','value2','value3');
INSERT INTO table2 (customerId,product,cost)
VALUES(LAST_INSERT_ID(),'valueA','valueB');

Đây là những gì nó được sử dụng. Nhưng đây là những vấn đề nếu bạn không sử dụng nó.

Trước tiên, nếu bạn không tham gia một giao dịch được tuần tự thì bạn phải sử dụng LAST_INSERT_ID (). Bởi vì sau khi bạn chèn table1 nhưng trước khi table2 của bạn chèn những người khác có thể đã thêm hàng và / hoặc xóa các hàng bao gồm hàng mới của bạn và / hoặc các hàng đã thay đổi bao gồm hàng mới của bạn. Vì vậy, bạn không thể dựa vào việc truy vấn table1 sau khi chèn của nó, hãy lấy một số giá trị customerId mà bạn biết là bạn đã thêm.

Thứ hai, giả sử bạn đang tham gia một giao dịch được tuần tự hóa và bạn không sử dụng LAST_INSERT_ID ().

Nếu (Tên khách hàng, Địa chỉ, Tiểu bang) cũng là một siêu khóa của table1, tức là các giá trị của nó là duy nhất, tức là SQL UNIQUE / KEY / PK được khai báo trên tất cả hoặc một số cột của nó, sau đó bạn có thể sử dụng nó để truy vấn cho customerId mới được liên kết:

set @customerId = (
    SELECT customerId
    FROM table1
    WHERE CustomerName = 'value1'
    AND Address = 'value2'
    AND State = 'value3');
INSERT INTO table2 (customerId,product,cost)
VALUES(@customerId,'valueA','valueB');

Nhưng nếu (Tên khách hàng, Địa chỉ, Tiểu bang) không phải là siêu khóa của table1 thì bạn không thể làm điều này. Bởi vì các hàng khác trùng lặp với con đó có thể nằm trong table1. Vì vậy, bạn có thể lấy lại nhiều hàng. Vì vậy, bạn sẽ không biết cái nào là cái mới nhất. Thay vào đó, bạn phải truy vấn table1 trước khi chèn, sau đó chèn, sau đó tìm sự khác biệt giữa tập hợp customerIds cũ và mới:

CREATE TEMPORARY TABLE table1old (
    customerId (int) PRIMARY KEY
    );
INSERT INTO table1old
SELECT customerId FROM table1;

INSERT INTO table1 (CustomerName,Address,State)
VALUES('value1','value2','value3');

set @customerId = (
    SELECT customerId
    FROM table1
    WHERE CustomerName NOT IN table1old);
INSERT INTO table2 (customerId,product,cost)
VALUES(@customerId,'valueA','valueB');

Chỉ cần sử dụng LAST_INSERT_ID ().

Tái bút:Thật thú vị, với các định nghĩa bảng, lý tưởng nhất là người ta có thể viết:

INSERT INTO (
    SELECT CustomerName,Address,State,A,B
    FROM table1 JOIN table2
    USING (CustomerId))
VALUES('value1','value2','value3','valueA','valueB')

vì chỉ có một cặp giá trị table1 &table2 mới có thể dẫn đến. Có một số cập nhật pháp lý thông qua các dạng xem trong SQL, mặc dù không có bản cập nhật nào liên quan đến nhiều bảng trong MySQL hiện tại




  1. DBeaver
  2.   
  3. phpMyAdmin
  4.   
  5. Navicat
  6.   
  7. SSMS
  8.   
  9. MySQL Workbench
  10.   
  11. SQLyog
  1. PHP Chèn vào lỗi cú pháp MySQL

  2. # 1193 - Biến hệ thống không xác định 'lc_messages' khi cố gắng đăng nhập vào phpmyadmin

  3. Gửi dữ liệu như số nguyên và chuỗi văn bản từ điện thoại đến cơ sở dữ liệu web

  4. MySQL không hiển thị cơ sở dữ liệu được tạo trong phpMyAdmin

  5. phpMyAdmin - Lỗi:các tính năng quan hệ bị tắt