Hướng dẫn how do you create a relationship between two tables in mysql? - làm thế nào để bạn tạo mối quan hệ giữa hai bảng trong mysql?

CREATE TABLE accounts(
    account_id INT NOT NULL AUTO_INCREMENT,
    customer_id INT( 4 ) NOT NULL ,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
    PRIMARY KEY ( account_id )
)

and

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
)

How do I create a 'relationship' between the two tables? I want each account to be 'assigned' one customer_id (to indicate who owns it).

Bạn phải tự hỏi mình là mối quan hệ 1 đến 1 hay 1 trong số nhiều mối quan hệ. Đó là, mọi tài khoản đều có khách hàng và mọi khách hàng đều có tài khoản. Hoặc sẽ có khách hàng mà không có tài khoản. Câu hỏi của bạn ngụ ý sau này.

Nếu bạn muốn có mối quan hệ nghiêm ngặt 1 đến 1, chỉ cần hợp nhất hai bảng.

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)

Trong trường hợp khác, cách chính xác để tạo mối quan hệ giữa hai bảng là tạo bảng mối quan hệ.

CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}

Sau đó, nếu bạn có khách hàng_id và muốn thông tin tài khoản, bạn tham gia vào khách hàng và tài khoản:

SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;

Vì lập chỉ mục này sẽ nhanh chóng bị mù.

Bạn cũng có thể tạo một chế độ xem cung cấp cho bạn hiệu ứng của bảng khách hàng kết hợp trong khi giữ chúng riêng biệt

CREATE VIEW customeraccounts AS 
    SELECT a.*, c.* FROM customersaccounts ca
        INNER JOIN accounts a ON ca.account_id=a.account_id
        INNER JOIN customers c ON ca.customer_id=c.customer_id;

Cho đến nay trong cuốn sách này, tất cả các công việc chúng tôi đã thực hiện với một bảng cơ sở dữ liệu duy nhất. Phần lớn các cơ sở dữ liệu bạn sẽ làm việc với tư cách là nhà phát triển sẽ có nhiều hơn một bảng và các bảng đó sẽ được kết nối với nhau theo nhiều cách khác nhau để hình thành các mối quan hệ bảng. Trong chương này, chúng tôi sẽ khám phá lý do có nhiều bảng trong cơ sở dữ liệu, hãy xem cách xác định mối quan hệ giữa các bảng khác nhau và phác thảo các loại mối quan hệ bảng khác nhau có thể tồn tại.

Bình thường hóa

Tại thời điểm này, bảng

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 của chúng tôi không cần phải giữ nhiều dữ liệu đó cho mỗi người dùng trong hệ thống của chúng tôi. Nó lưu trữ tên cho người dùng, cho dù tài khoản của họ có được bật hay không, khi họ đăng nhập lần cuối và ID để xác định từng bản ghi người dùng. Trong thực tế, các yêu cầu của ứng dụng của chúng tôi sẽ có nghĩa là chúng tôi cần lưu trữ nhiều dữ liệu hơn thế. Ứng dụng của chúng tôi sẽ được sử dụng để quản lý một thư viện sách SQL và cho phép người dùng kiểm tra các cuốn sách và cũng xem xét chúng.

Để thực hiện một số yêu cầu này, chúng tôi chỉ có thể thử thêm nhiều cột vào bảng

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 của chúng tôi; Bảng kết quả có thể trông hơi như sau:

Hướng dẫn how do you create a relationship between two tables in mysql? - làm thế nào để bạn tạo mối quan hệ giữa hai bảng trong mysql?

Wow, đó là rất nhiều thông tin trong một bảng! Cũng có những vấn đề khác ở đây, chẳng hạn như sao chép dữ liệu (thường được gọi là 'dự phòng'). Đối với mỗi cuốn sách mà người dùng kiểm tra, chúng tôi phải lặp lại tất cả dữ liệu người dùng trong bảng của chúng tôi. Đó là một câu chuyện tương tự với dữ liệu sách, nếu có nhiều hơn một người kiểm tra một cuốn sách, chẳng hạn như với 'cuốn sách SQL thứ hai của tôi', chúng ta phải lặp lại tiêu đề sách, tác giả, ISBN và ngày xuất bản.

Việc sao chép dữ liệu theo cách này có thể dẫn đến các vấn đề với tính toàn vẹn dữ liệu. Ví dụ, điều gì sẽ xảy ra nếu đối với một trong những 'cuốn sách SQL thứ hai của tôi', thay vào đó, tiêu đề được nhập dưới dạng 'cuốn sách SQL thứ 2 của tôi', hoặc một lỗi đánh máy đã được thực hiện với ISBN trên một trong các hàng? Từ việc nhìn vào dữ liệu trong bảng, làm thế nào chúng ta biết phần dữ liệu nào là chính xác?

Làm thế nào để chúng ta đối phó với tình huống này? Câu trả lời là phân chia dữ liệu của chúng tôi trên nhiều bảng khác nhau và tạo mối quan hệ giữa chúng. Quá trình phân tách dữ liệu theo cách này để loại bỏ sự trùng lặp và cải thiện tính toàn vẹn của dữ liệu được gọi là bình thường hóa.

Chuẩn hóa là một chủ đề sâu sắc và có những bộ quy tắc phức tạp chỉ ra mức độ mà cơ sở dữ liệu được đánh giá là được chuẩn hóa. Những bộ quy tắc này, được gọi là 'các hình thức bình thường', nằm ngoài phạm vi của cuốn sách này; Bây giờ có hai điều quan trọng cần nhớ:

  • Lý do bình thường hóa là để giảm dự phòng dữ liệu và cải thiện tính toàn vẹn của dữ liệu
  • Cơ chế thực hiện bình thường hóa là sắp xếp dữ liệu theo nhiều bảng và xác định mối quan hệ giữa chúng

Chúng tôi biết rằng chúng tôi muốn chia dữ liệu cho ứng dụng của chúng tôi trên nhiều bảng, nhưng làm thế nào để chúng tôi quyết định những bảng đó nên là gì và mối quan hệ nào nên tồn tại giữa chúng? Khi trả lời các câu hỏi như thế này, nó thường hữu ích để thu nhỏ và nghĩ rằng ở mức độ trừu tượng cao hơn, và đây là nơi quá trình thiết kế cơ sở dữ liệu xuất hiện.

Thiết kế cơ sở dữ liệu

Ở cấp độ cao, quá trình thiết kế cơ sở dữ liệu liên quan đến việc xác định các thực thể để thể hiện các loại dữ liệu và mối quan hệ thiết kế khác nhau giữa các thực thể đó. Nhưng chúng ta có ý nghĩa gì với các thực thể, và làm thế nào để các thực thể khác nhau liên quan đến nhau? Hãy cùng tìm hiểu.entities to represent different sorts of data and designing relationships between those entities. But what do we mean by entities, and how do different entities relate to each other? Let's find out.

Thực thể

Một thực thể đại diện cho một đối tượng thế giới thực hoặc một tập hợp dữ liệu mà chúng tôi muốn mô hình hóa trong cơ sở dữ liệu của chúng tôi; Chúng ta thường có thể xác định những thứ này là danh từ chính của hệ thống mà chúng ta đang mô hình hóa. Đối với mục đích của cuốn sách này, chúng tôi sẽ cố gắng và giữ cho mọi thứ đơn giản và rút ra mối tương quan trực tiếp giữa một thực thể và một bảng dữ liệu duy nhất; Tuy nhiên, trong một cơ sở dữ liệu thực, dữ liệu cho một thực thể duy nhất có thể được lưu trữ trong nhiều bảng.

Những thực thể nào chúng ta có thể xác định cho ứng dụng sách SQL của mình?

  • Chà, chúng tôi đã có một bảng
    CREATE TABLE customers(
        customer_id INT NOT NULL AUTO_INCREMENT,
        name VARCHAR(20) NOT NULL,
        address VARCHAR(20) NOT NULL,
        city VARCHAR(20) NOT NULL,
        state VARCHAR(20) NOT NULL,
        account_type ENUM( 'savings', 'credit' ) NOT NULL,
        balance FLOAT( 9 ) NOT NULL,
    )
    
    7 và chúng tôi có thể nghĩ người dùng là một thực thể cụ thể trong ứng dụng của chúng tôi; 'Người dùng' là người sử dụng ứng dụng của chúng tôi.user as a specific entity within our app; a 'user' is someone who uses our app.
  • Mục đích của ứng dụng SQL Book của chúng tôi là cho phép người dùng sử dụng sách về SQL, vì vậy trong bối cảnh này, chúng tôi có thể nghĩ về sách như một thực thể trong hệ thống của chúng tôi.books as an entity within our system.
  • Một trong những điều mà người dùng của chúng tôi có thể làm là kiểm tra sách, vì vậy chúng tôi có thể có một thực thể thứ ba có tên là Thanh toán tồn tại giữa người dùng và sách.checkouts that exists between users and books.
  • Chúng tôi cũng muốn người dùng có thể để lại đánh giá về những cuốn sách họ đã đọc, vì vậy chúng tôi có thể có một thực thể khác được gọi là đánh giá.reviews.
  • Cuối cùng, chúng tôi muốn lưu trữ thông tin địa chỉ cho mỗi người dùng. Vì dữ liệu địa chỉ này thỉnh thoảng sẽ chỉ được sử dụng và không cho mọi tương tác của người dùng, chúng tôi quyết định lưu trữ nó trong một bảng riêng. Chúng ta vẫn có khả năng nghĩ về dữ liệu địa chỉ này là một phần của thực thể 'người dùng', nhưng bây giờ chúng ta hãy nghĩ về nó như một thực thể riêng biệt được gọi là địa chỉ.addresses.

Bây giờ chúng tôi đã xác định các thực thể chúng tôi cần, chúng tôi có thể lập kế hoạch các bảng để lưu trữ dữ liệu cho từng thực thể. Những bảng đó có thể trông giống như thế này:

Hướng dẫn how do you create a relationship between two tables in mysql? - làm thế nào để bạn tạo mối quan hệ giữa hai bảng trong mysql?

Các mối quan hệ

Chúng tôi đang có tiến bộ tốt với thiết kế cơ sở dữ liệu của chúng tôi. Chúng tôi đã quyết định về các thực thể chúng tôi muốn và đã hình thành một hình ảnh về các bảng chúng tôi cần, các cột trong các bảng đó và thậm chí các ví dụ về dữ liệu mà các cột đó sẽ giữ. Mặc dù thiếu một cái gì đó, và đó là mối quan hệ giữa các thực thể của chúng tôi.

Nếu chúng ta nhìn vào sơ đồ của năm bảng của chúng ta, các bảng đều bị cô lập và không rõ ràng làm thế nào các bảng này nên liên quan đến nhau. Hãy đơn giản hóa các bảng của chúng tôi một chút và xác định rõ ràng một số mối quan hệ giữa chúng.

Hướng dẫn how do you create a relationship between two tables in mysql? - làm thế nào để bạn tạo mối quan hệ giữa hai bảng trong mysql?

Biểu đồ này cho thấy một đại diện trừu tượng của các thực thể khác nhau của chúng tôi và cả các mối quan hệ giữa chúng, (lưu ý: trong thực tế chúng ta có thể tưởng tượng rằng nhiều người dùng có thể chia sẻ cùng một địa chỉ; cấu trúc này được dành cho mục đích minh họa). Chúng ta có thể nghĩ về sơ đồ này như một sơ đồ mối quan hệ thực thể đơn giản hoặc ERD. ERD là một đại diện đồ họa của các thực thể và các mối quan hệ của chúng với nhau và là một công cụ thường được sử dụng trong thiết kế cơ sở dữ liệu.ERD. An ERD is a graphical representation of entities and their relationships to each other, and is a commonly used tool within database design.

Có nhiều loại ERD khác nhau khác nhau từ khái niệm đến chi tiết và thường sử dụng các quy ước cụ thể như ký hiệu chân của Crow để mô hình hóa các mối quan hệ. Chúng tôi sẽ không đi sâu vào chi tiết của các loại khác nhau này, hoặc các quy ước họ sử dụng, trong cuốn sách này. Cho đến bây giờ, thật hữu ích khi chỉ cần nghĩ về một ERD như bất kỳ sơ đồ nào mô hình hóa mối quan hệ giữa các thực thể.

Chìa khóa

Được rồi, vì vậy bây giờ chúng ta biết các bảng mà chúng ta cần và chúng ta cũng đã xác định các mối quan hệ nên tồn tại giữa các bảng đó trong ERD của chúng ta, nhưng làm thế nào để chúng ta thực sự thực hiện các mối quan hệ đó theo lược đồ bảng của chúng ta? Câu trả lời cho điều đó là sử dụng các phím.

Trong một phần trước của cuốn sách này, chúng tôi đã xem xét một khía cạnh của lược đồ gọi là các ràng buộc và khám phá cách các ràng buộc hành động và làm việc với dữ liệu trong các bảng cơ sở dữ liệu của chúng tôi. Chìa khóa là một loại ràng buộc đặc biệt được sử dụng để thiết lập các mối quan hệ và tính độc đáo. Chúng có thể được sử dụng để xác định một hàng cụ thể trong bảng hiện tại hoặc để chỉ một hàng cụ thể trong một bảng khác. Trong chương này, chúng tôi sẽ xem xét hai loại khóa hoàn thành các vai trò cụ thể này: khóa chính và khóa nước ngoài.Primary Keys, and Foreign Keys.

Chìa khóa chính

Một phần cần thiết trong việc thiết lập mối quan hệ giữa hai thực thể hoặc hai phần dữ liệu có thể xác định chính xác dữ liệu. Trong SQL, dữ liệu xác định duy nhất là rất quan trọng. Khóa chính là một định danh duy nhất cho một hàng dữ liệu.A Primary Key is a unique identifier for a row of data.

Để hoạt động như một định danh duy nhất, một cột phải chứa một số dữ liệu và dữ liệu đó phải là duy nhất cho mỗi hàng. Nếu bạn đang nghĩ rằng những yêu cầu đó nghe rất giống các ràng buộc

CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
0 và
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
1 của chúng tôi, bạn sẽ đúng; Trên thực tế, việc biến một cột A
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
2 về cơ bản tương đương với việc thêm các ràng buộc
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
0 và
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
1 vào cột đó.

Cột

CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 trong bảng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 của chúng tôi có cả hai ràng buộc này và chúng tôi đã sử dụng cột đó trong nhiều truy vấn
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
7 của chúng tôi để xác định duy nhất các hàng; Chúng tôi đã có
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 một cách hiệu quả như là một khóa chính mặc dù chúng tôi không đặt nó một cách rõ ràng là khóa chính. Hãy làm điều đó ngay bây giờ:

ALTER TABLE users ADD PRIMARY KEY (id);

Mặc dù bất kỳ cột nào trong bảng có thể có các ràng buộc

CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
1 và
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
0 được áp dụng cho chúng, mỗi bảng chỉ có thể có một khóa chính. Đó là thực tế phổ biến cho khóa chính đó là một cột có tên
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5. Nếu bạn nhìn vào các bảng khác mà chúng tôi đã xác định cho cơ sở dữ liệu của chúng tôi, hầu hết chúng đều có cột
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5. Mặc dù một cột của bất kỳ tên nào cũng có thể đóng vai trò là khóa chính, nhưng sử dụng một cột có tên
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 rất hữu ích cho các lý do ghi nhớ và một quy ước phổ biến cũng vậy.

Có thể xác định duy nhất một hàng dữ liệu trong bảng thông qua cột khóa chính của bảng đó chỉ là một nửa câu chuyện khi tạo mối quan hệ giữa các bảng. Nửa còn lại của câu chuyện này là đối tác của khóa chính, Key nước ngoài.

Chìa khóa nước ngoài

Khóa nước ngoài cho phép chúng tôi liên kết một hàng trong một bảng với một hàng trong một bảng khác. Điều này được thực hiện bằng cách đặt một cột trong một bảng làm khóa ngoại và có cột tham chiếu cột đó cột chính của một bảng khác. Tạo mối quan hệ này được thực hiện bằng cách sử dụng từ khóa

SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;
4 trong biểu mẫu này:

FOREIGN KEY (fk_col_name)
REFERENCES target_table_name (pk_col_name);

Chúng tôi sẽ khám phá một số ví dụ cụ thể về cách sử dụng điều này khi chúng tôi xem xét việc thiết lập các loại mối quan hệ khác nhau sau này trong chương này, nhưng nói chung, bạn có thể nghĩ về tài liệu tham khảo này như tạo kết nối giữa các hàng trong các bảng khác nhau.

Ví dụ, hãy tưởng tượng rằng chúng ta có hai bảng, một cái được gọi là

SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;
5 và một cái được gọi là
SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;
6. Cột
SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;
7 của bảng
SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;
6 là một khóa nước ngoài tham chiếu cột
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 của bảng
SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;
5.

Hướng dẫn how do you create a relationship between two tables in mysql? - làm thế nào để bạn tạo mối quan hệ giữa hai bảng trong mysql?

Trong sơ đồ trên, hàng 'màu đỏ' của bảng

SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;
5 của chúng tôi được liên kết với các hàng 'hình vuông' và 'ngôi sao' của bảng
SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;
6 của chúng tôi. Tương tự, 'màu xanh' được liên kết với 'tam giác' và 'màu xanh lá cây' với 'vòng tròn'. 'Orange' hiện không được liên kết với bất kỳ hàng nào trong bảng
SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;
6, nhưng có khả năng tạo ra một hiệp hội như vậy nếu chúng ta chèn một hàng vào
SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;
6 với
SELECT a.*
    FROM customersaccounts ca
        INNER JOIN accounts a ca.account_id=a.account_id
            AND ca.customer_id=mycustomerid;
7 của
CREATE VIEW customeraccounts AS 
    SELECT a.*, c.* FROM customersaccounts ca
        INNER JOIN accounts a ON ca.account_id=a.account_id
        INNER JOIN customers c ON ca.customer_id=c.customer_id;
6.

Bằng cách thiết lập tài liệu tham khảo này, chúng tôi đảm bảo tính toàn vẹn tham chiếu của một mối quan hệ. Tính toàn vẹn tham chiếu là sự đảm bảo rằng giá trị cột trong bản ghi phải tham chiếu một giá trị hiện có; Nếu không có lỗi thì bị ném. Nói cách khác, PostgreSQL sẽ không cho phép bạn thêm giá trị vào cột khóa nước ngoài của bảng nếu cột khóa chính của bảng mà nó tham khảo không chứa giá trị đó. Chúng tôi sẽ thảo luận về khái niệm này chi tiết hơn một chút sau này.

Cách cụ thể trong đó khóa nước ngoài được sử dụng như một phần của lược đồ của bảng phụ thuộc vào loại mối quan hệ mà chúng tôi muốn xác định giữa các bảng của chúng tôi. Để thực hiện lược đồ đó một cách chính xác, thật hữu ích khi chính thức mô tả các mối quan hệ chúng ta cần mô hình hóa giữa các thực thể của chúng ta:

  1. Người dùng có thể có một địa chỉ. Một địa chỉ chỉ có một người dùng.ONE address. An address has only ONE user.
  2. Một đánh giá chỉ có thể là về một cuốn sách. Một cuốn sách có thể có nhiều đánh giá.ONE Book. A Book can have MANY reviews.
  3. Một người dùng có thể có nhiều cuốn sách mà anh ấy/cô ấy có thể đã kiểm tra hoặc trả lại. Một cuốn sách có thể được/ đã được kiểm tra bởi nhiều người dùng.MANY books that he/she may have checked out or returned. A Book can be/ have been checked out by MANY users.

Các mối quan hệ thực thể được mô tả ở trên có thể được phân loại thành ba loại mối quan hệ:

  • một-một
  • một-nhiều
  • nhiều nhiều

Lần lượt nhìn vào họ.

one-to-one

Một mối quan hệ một-một giữa hai thực thể tồn tại khi một thể hiện thực thể cụ thể tồn tại trong một bảng và nó chỉ có thể có một thể hiện thực thể liên quan trong một bảng khác.

Ví dụ: Người dùng chỉ có thể có một địa chỉ và địa chỉ chỉ thuộc về một người dùng. A user can have only one address, and an address belongs to only one user.

Ví dụ này là giả định: Trong thế giới thực, người dùng có thể có nhiều địa chỉ và nhiều người có thể sống ở cùng một địa chỉ.

Trong thế giới cơ sở dữ liệu, loại mối quan hệ này được thực hiện như thế này:

CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 đó là
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
2 của bảng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 được sử dụng như cả
ALTER TABLE users ADD PRIMARY KEY (id);
0 và
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
2 của bảng
ALTER TABLE users ADD PRIMARY KEY (id);
2.

/*
one-to-one: User has one address
*/

CREATE TABLE addresses (
  user_id int, -- Both a primary and foreign key
  street varchar(30) NOT NULL,
  city varchar(30) NOT NULL,
  state varchar(30) NOT NULL,
  PRIMARY KEY (user_id),
  FOREIGN KEY (user_id)
      REFERENCES users (id)
      ON DELETE CASCADE
);

Thực hiện câu lệnh SQL ở trên sẽ tạo bảng

ALTER TABLE users ADD PRIMARY KEY (id);
2 và tạo mối quan hệ giữa nó và bảng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7. Lưu ý các điều khoản
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
2 và
ALTER TABLE users ADD PRIMARY KEY (id);
0 ở cuối câu lệnh
ALTER TABLE users ADD PRIMARY KEY (id);
7. Hai mệnh đề này tạo ra các ràng buộc làm cho
ALTER TABLE users ADD PRIMARY KEY (id);
8 là khóa chính của bảng
ALTER TABLE users ADD PRIMARY KEY (id);
2 và cũng là khóa ngoại cho bảng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7.

Hãy tiếp tục và thêm một số dữ liệu vào bảng của chúng tôi.

INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');

Cột

ALTER TABLE users ADD PRIMARY KEY (id);
8 sử dụng các giá trị tồn tại trong cột
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 của bảng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 để kết nối các bảng thông qua ràng buộc khóa nước ngoài mà chúng tôi vừa tạo.

Hướng dẫn how do you create a relationship between two tables in mysql? - làm thế nào để bạn tạo mối quan hệ giữa hai bảng trong mysql?

Tính toàn vẹn tham chiếu

Chúng ta sẽ đi đường vòng nhỏ ở đây để thảo luận về một chủ đề cực kỳ quan trọng khi xử lý các mối quan hệ bảng: tính toàn vẹn tham chiếu. Đây là một khái niệm được sử dụng khi thảo luận về dữ liệu quan hệ trong đó nói rằng các mối quan hệ bảng phải luôn nhất quán. Các RDBMS khác nhau có thể thực thi các quy tắc toàn vẹn tham chiếu khác nhau, nhưng khái niệm này là như nhau.

Các ràng buộc mà chúng tôi đã xác định cho bảng

ALTER TABLE users ADD PRIMARY KEY (id);
2 của chúng tôi thực thi mối quan hệ một-một mà chúng tôi muốn giữa bảng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 của chúng tôi, theo đó người dùng chỉ có thể có một địa chỉ và địa chỉ phải có một và chỉ một người dùng. Đây là một ví dụ về tính toàn vẹn tham chiếu. Hãy trình bày cách thức hoạt động của nó.

Điều gì xảy ra nếu chúng ta cố gắng thêm một địa chỉ khác cho người dùng đã có một địa chỉ?

INSERT INTO addresses (user_id, street, city, state)
  VALUES (1, '2 Park Road', 'San Francisco', 'CA');
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
0

Lỗi trên xảy ra vì chúng tôi đang cố gắng chèn một giá trị

FOREIGN KEY (fk_col_name)
REFERENCES target_table_name (pk_col_name);
6 vào cột
ALTER TABLE users ADD PRIMARY KEY (id);
8 khi giá trị như vậy đã tồn tại trong cột đó. Hạn chế
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
1 trên cột ngăn chúng ta làm như vậy.

Làm thế nào nếu chúng ta cố gắng thêm một địa chỉ cho người dùng không tồn tại?

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
1
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
2

Ở đây chúng tôi nhận được một lỗi khác. Ràng buộc

ALTER TABLE users ADD PRIMARY KEY (id);
0 trên cột
ALTER TABLE users ADD PRIMARY KEY (id);
8 ngăn chúng ta thêm giá trị
/*
one-to-one: User has one address
*/

CREATE TABLE addresses (
  user_id int, -- Both a primary and foreign key
  street varchar(30) NOT NULL,
  city varchar(30) NOT NULL,
  state varchar(30) NOT NULL,
  PRIMARY KEY (user_id),
  FOREIGN KEY (user_id)
      REFERENCES users (id)
      ON DELETE CASCADE
);
1 vào cột đó vì giá trị đó không có trong cột
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 của bảng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7.

Nếu bạn đang tự hỏi tại sao chúng ta có thể thêm người dùng mà không có địa chỉ nhưng không thể thêm địa chỉ mà không có người dùng, điều này là do phương thức của mối quan hệ giữa hai thực thể. Đừng lo lắng về chính xác điều này có nghĩa là gì bây giờ, chỉ cần nghĩ về nó như một khía cạnh khác của các mối quan hệ thực thể.

Mệnh đề xóa trên

Bạn có thể đã nhận thấy trong câu lệnh tạo bảng cho bảng

ALTER TABLE users ADD PRIMARY KEY (id);
2 của chúng tôi, định nghĩa
ALTER TABLE users ADD PRIMARY KEY (id);
0 bao gồm một mệnh đề đọc
/*
one-to-one: User has one address
*/

CREATE TABLE addresses (
  user_id int, -- Both a primary and foreign key
  street varchar(30) NOT NULL,
  city varchar(30) NOT NULL,
  state varchar(30) NOT NULL,
  PRIMARY KEY (user_id),
  FOREIGN KEY (user_id)
      REFERENCES users (id)
      ON DELETE CASCADE
);
6. Thêm mệnh đề này và đặt nó thành
/*
one-to-one: User has one address
*/

CREATE TABLE addresses (
  user_id int, -- Both a primary and foreign key
  street varchar(30) NOT NULL,
  city varchar(30) NOT NULL,
  state varchar(30) NOT NULL,
  PRIMARY KEY (user_id),
  FOREIGN KEY (user_id)
      REFERENCES users (id)
      ON DELETE CASCADE
);
7 về cơ bản có nghĩa là nếu hàng được tham chiếu sẽ bị xóa, hàng tham chiếu, nó cũng bị xóa. Có những lựa chọn thay thế cho
/*
one-to-one: User has one address
*/

CREATE TABLE addresses (
  user_id int, -- Both a primary and foreign key
  street varchar(30) NOT NULL,
  city varchar(30) NOT NULL,
  state varchar(30) NOT NULL,
  PRIMARY KEY (user_id),
  FOREIGN KEY (user_id)
      REFERENCES users (id)
      ON DELETE CASCADE
);
7, chẳng hạn như
/*
one-to-one: User has one address
*/

CREATE TABLE addresses (
  user_id int, -- Both a primary and foreign key
  street varchar(30) NOT NULL,
  city varchar(30) NOT NULL,
  state varchar(30) NOT NULL,
  PRIMARY KEY (user_id),
  FOREIGN KEY (user_id)
      REFERENCES users (id)
      ON DELETE CASCADE
);
9 hoặc
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
0 thay vì xóa hàng tham chiếu sẽ đặt một giá trị mới trong cột thích hợp cho hàng đó.

Xác định những việc cần làm trong các tình huống mà bạn xóa một hàng được tham chiếu bởi một hàng khác là một quyết định thiết kế quan trọng và là một phần của khái niệm duy trì tính toàn vẹn tham chiếu. Nếu chúng tôi không đặt ra các điều khoản như vậy, chúng tôi sẽ để lại quyết định làm gì với RDBM mà chúng tôi đang sử dụng. Trong trường hợp của PostgreSQL, nếu chúng ta cố gắng xóa một hàng đang được tham chiếu bởi một hàng trong một bảng khác và chúng ta không có mệnh đề

INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
1 cho tài liệu tham khảo đó, thì sẽ bị lỗi.

One-to-Many

Được rồi, thời gian để trở lại với các loại mối quan hệ bàn khác nhau của chúng tôi với một cái nhìn một-nhiều. Mối quan hệ một-nhiều tồn tại giữa hai thực thể nếu một thể hiện thực thể trong một trong các bảng có thể được liên kết với nhiều hồ sơ (các trường hợp thực thể) trong bảng khác. Mối quan hệ ngược lại không tồn tại; nghĩa là, mỗi thể hiện thực thể trong bảng thứ hai chỉ có thể được liên kết với một thể hiện thực thể trong bảng thứ nhất.

Ví dụ: Một đánh giá chỉ thuộc về một cuốn sách. Một cuốn sách có nhiều đánh giá. A review belongs to only one book. A book has many reviews.

Hãy thiết lập dữ liệu cần thiết. Trước tiên hãy tạo bảng của chúng tôi

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
3

Các câu lệnh tạo bảng này cho các bảng

INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2 và
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
3 của chúng tôi khá giống với ví dụ trước của chúng tôi. Tuy nhiên, có một sự khác biệt chính đáng để chỉ ra trong tuyên bố cho bảng
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
3 của chúng tôi: Tuy nhiên:

  • Không giống như bảng
    ALTER TABLE users ADD PRIMARY KEY (id);
    
    2 của chúng tôi, các cột tham chiếu
    CREATE TABLE customersaccounts(
        customer_id INT NOT NULL,
        account_id INT NOT NULL,
        PRIMARY KEY (customer_id, account_id),
        FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
        FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
    }
    
    2 và
    ALTER TABLE users ADD PRIMARY KEY (id);
    
    0 tương ứng,
    CREATE TABLE customersaccounts(
        customer_id INT NOT NULL,
        account_id INT NOT NULL,
        PRIMARY KEY (customer_id, account_id),
        FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
        FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
    }
    
    5 và
    INSERT INTO addresses
             (user_id, street, city, state)
      VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
             (2, '2 Elm Street', 'San Francisco', 'CA'),
             (3, '3 Main Street', 'Boston', 'MA');
    
    9. Điều này có nghĩa là cột
    ALTER TABLE users ADD PRIMARY KEY (id);
    
    0,
    INSERT INTO addresses
             (user_id, street, city, state)
      VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
             (2, '2 Elm Street', 'San Francisco', 'CA'),
             (3, '3 Main Street', 'Boston', 'MA');
    
    9 không bị ràng buộc bởi ràng buộc
    CREATE TABLE customersaccounts(
        customer_id INT NOT NULL,
        account_id INT NOT NULL,
        PRIMARY KEY (customer_id, account_id),
        FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
        FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
    }
    
    1 của
    CREATE TABLE customersaccounts(
        customer_id INT NOT NULL,
        account_id INT NOT NULL,
        PRIMARY KEY (customer_id, account_id),
        FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
        FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
    }
    
    2 của chúng tôi và do đó cùng một giá trị từ cột
    CREATE TABLE customersaccounts(
        customer_id INT NOT NULL,
        account_id INT NOT NULL,
        PRIMARY KEY (customer_id, account_id),
        FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
        FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
    }
    
    5 của bảng
    INSERT INTO addresses
             (user_id, street, city, state)
      VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
             (2, '2 Elm Street', 'San Francisco', 'CA'),
             (3, '3 Main Street', 'Boston', 'MA');
    
    2 có thể xuất hiện trong cột này nhiều lần. Nói cách khác, một cuốn sách có thể có nhiều đánh giá.

Lưu ý rằng khóa nước ngoài

INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
9 có ràng buộc
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
0. Nói chung, các chìa khóa nước ngoài ở phía "nhiều" của mối quan hệ một-nhiều không nên cho phép
INSERT INTO addresses (user_id, street, city, state)
  VALUES (1, '2 Park Road', 'San Francisco', 'CA');
8. Trong trường hợp này, không có ý nghĩa gì khi có một đánh giá không gắn liền với một cuốn sách.

Bây giờ chúng tôi đã tạo các bảng

INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2 và
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
3 của chúng tôi, hãy thêm một số dữ liệu cho chúng.

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
4

Thứ tự chúng tôi thêm dữ liệu là quan trọng ở đây. Vì một cột trong

INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
3 Tài liệu tham khảo dữ liệu trong
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2, trước tiên chúng tôi phải đảm bảo rằng dữ liệu tồn tại trong bảng
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2 để chúng tôi tham khảo.

Hướng dẫn how do you create a relationship between two tables in mysql? - làm thế nào để bạn tạo mối quan hệ giữa hai bảng trong mysql?

Cũng giống như mối quan hệ ____ 17/

ALTER TABLE users ADD PRIMARY KEY (id);
2,
ALTER TABLE users ADD PRIMARY KEY (id);
0 tạo ra mối quan hệ giữa bảng
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
3 và bảng
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2. Tuy nhiên, không giống như mối quan hệ ____ 17/
ALTER TABLE users ADD PRIMARY KEY (id);
2, cả sách và người dùng đều có thể có nhiều đánh giá. Ví dụ, giá trị
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 của
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
12 cho
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
13 xuất hiện hai lần trong cột
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
9 của bảng
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
3.

Trong một cơ sở dữ liệu thực, bảng

INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
3 của chúng tôi có thể cũng sẽ có một tham chiếu khóa nước ngoài cho cột
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 trong bảng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 thay vì có dữ liệu loại người dùng trực tiếp trong cột
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
19. Chúng tôi thiết lập bảng theo cách này cho ví dụ của chúng tôi vì chúng tôi muốn tập trung vào loại mối quan hệ một-nhiều. Nếu chúng tôi đã thêm một chìa khóa nước ngoài như vậy vào
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
3, chúng tôi thực sự sẽ thiết lập mối quan hệ nhiều đến nhiều giữa
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2 và
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7, đó là những gì chúng tôi sẽ xem xét tiếp theo.

Many-to-Many

Một mối quan hệ nhiều-nhiều tồn tại giữa hai thực thể nếu đối với một trường hợp thực thể có thể có nhiều hồ sơ trong bảng khác và ngược lại.

Ví dụ: Người dùng có thể kiểm tra nhiều sách. Một cuốn sách có thể được kiểm tra bởi nhiều người dùng (theo thời gian). A user can check out many books. A book can be checked out by many users (over time).

Để thực hiện loại mối quan hệ này, chúng tôi cần giới thiệu một bảng thứ ba, tham chiếu chéo,. Bảng này giữ mối quan hệ giữa hai thực thể, bằng cách có hai ____50, mỗi thực phẩm tham khảo khóa chính của một trong các bảng mà chúng tôi muốn tạo mối quan hệ này. Chúng tôi đã có bảng

INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2 và
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 của chúng tôi, vì vậy chúng tôi chỉ cần tạo bảng tham chiếu chéo:
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
26.two
ALTER TABLE users ADD PRIMARY KEY (id);
0s, each of which references the PRIMARY KEY of one of the tables for which we want to create this relationship. We already have our
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2 and
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 tables, so we just need to create the cross-reference table:
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
26.

Hướng dẫn how do you create a relationship between two tables in mysql? - làm thế nào để bạn tạo mối quan hệ giữa hai bảng trong mysql?

Ở đây, cột

ALTER TABLE users ADD PRIMARY KEY (id);
8 trong
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
26 tham chiếu cột
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 trong
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 và cột
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
9 trong
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
26 tham chiếu cột
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 trong
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2. Mỗi hàng của bảng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
26 sử dụng hai khóa nước ngoài này để tạo mối liên hệ giữa các hàng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 và
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2.

Chúng ta có thể thấy trên hàng đầu tiên của

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
26, người dùng có
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 của
FOREIGN KEY (fk_col_name)
REFERENCES target_table_name (pk_col_name);
6 được liên kết với cuốn sách với
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 của
FOREIGN KEY (fk_col_name)
REFERENCES target_table_name (pk_col_name);
6. Ở hàng thứ hai, cùng một người dùng cũng được liên kết với cuốn sách với
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 của
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
12. Ở hàng thứ ba, một người dùng khác, với
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 của
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
12 được liên kết với cùng một cuốn sách từ hàng trước. Ở hàng thứ tư, người dùng có
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 của
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
48 được liên kết với cuốn sách với
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 là
CREATE VIEW customeraccounts AS 
    SELECT a.*, c.* FROM customersaccounts ca
        INNER JOIN accounts a ON ca.account_id=a.account_id
        INNER JOIN customers c ON ca.customer_id=c.customer_id;
6.

Đừng lo lắng nếu bạn không hoàn toàn hiểu điều này ngay lập tức. Một thời gian ngắn, chúng tôi sẽ mở rộng về các hiệp hội này trông như thế nào về dữ liệu trong

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 và
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2. Tuy nhiên, trước tiên, hãy tạo bảng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
26 của chúng tôi và thêm một số dữ liệu vào đó.

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
5

Bạn có thể nhận thấy rằng bảng của chúng tôi chứa một vài cột khác

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
54 và
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
55. Mặc dù những điều này không cần thiết để tạo ra mối quan hệ giữa bảng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 và
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2, nhưng chúng có thể cung cấp bối cảnh bổ sung cho mối quan hệ đó. Các thuộc tính như ngày thanh toán hoặc ngày trả lại không liên quan cụ thể đến người dùng hoặc cụ thể với sách, mà là sự liên kết giữa người dùng và một cuốn sách.

Loại ngữ cảnh bổ sung này có thể hữu ích trong logic kinh doanh của ứng dụng bằng cơ sở dữ liệu của chúng tôi. Ví dụ: để ngăn chặn nhiều người dùng cố gắng kiểm tra cùng một cuốn sách cùng một lúc, ứng dụng có thể xác định sách nào hiện đang được kiểm tra bằng cách truy vấn những cuốn có giá trị trong cột

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
54 của bảng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
26 nhưng trong đó
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
55 được đặt thành
INSERT INTO addresses (user_id, street, city, state)
  VALUES (1, '2 Park Road', 'San Francisco', 'CA');
8.

Cũng như các mối quan hệ một-nhiều, các khóa nước ngoài trong các mối quan hệ nhiều đến nhiều không nên cho phép các mục

INSERT INTO addresses (user_id, street, city, state)
  VALUES (1, '2 Park Road', 'San Francisco', 'CA');
8. Do đó, cả
ALTER TABLE users ADD PRIMARY KEY (id);
8 và
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
9 đều có ràng buộc
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
0. Trong trường hợp này, không có ý nghĩa gì khi có hàng thanh toán cho người dùng nếu họ chưa kiểm tra một cuốn sách cụ thể, cũng không có ý nghĩa gì khi có một hàng cho một cuốn sách chưa được kiểm tra bởi một người dùng cụ thể.

Bây giờ chúng tôi đã tạo

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
26, chúng tôi có thể thêm dữ liệu sẽ tạo ra các liên kết giữa các hàng trong
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 và
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2.

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
6

Chúng ta hãy xem dữ liệu này trông như thế nào về mối quan hệ giữa các bảng.

Hướng dẫn how do you create a relationship between two tables in mysql? - làm thế nào để bạn tạo mối quan hệ giữa hai bảng trong mysql?

Ở đây chúng ta có thể thấy rằng giá trị

CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 của
FOREIGN KEY (fk_col_name)
REFERENCES target_table_name (pk_col_name);
6 từ bảng
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7 cho 'John Smith' xuất hiện hai lần trong cột
ALTER TABLE users ADD PRIMARY KEY (id);
8 của
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
26, nhưng bên cạnh các giá trị khác nhau cho
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
9 (
FOREIGN KEY (fk_col_name)
REFERENCES target_table_name (pk_col_name);
6 và
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
12); Điều này thỏa mãn 'người dùng có thể kiểm tra nhiều cuốn sách' của mối quan hệ. Tương tự, chúng ta có thể thấy rằng giá trị
CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
5 của
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
12 từ bảng
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2 cho 'cuốn sách SQL thứ hai của tôi' xuất hiện hai lần trong cột
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
80 của
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
26, bên cạnh các giá trị khác nhau cho
ALTER TABLE users ADD PRIMARY KEY (id);
8 (
FOREIGN KEY (fk_col_name)
REFERENCES target_table_name (pk_col_name);
6 và
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
12); Điều này đáp ứng 'một cuốn sách có thể được kiểm tra bởi nhiều người dùng trong mối quan hệ.

Có lẽ chúng ta có thể nghĩ về một mối quan hệ nhiều đến nhiều khi kết hợp hai mối quan hệ một-nhiều; Trong trường hợp này giữa

CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
26 và
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
7, và giữa
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
26 và
INSERT INTO addresses
         (user_id, street, city, state)
  VALUES (1, '1 Market Street', 'San Francisco', 'CA'),
         (2, '2 Elm Street', 'San Francisco', 'CA'),
         (3, '3 Main Street', 'Boston', 'MA');
2.

Bản tóm tắt

Trong chương này, chúng tôi đã đề cập đến một số chủ đề khác nhau liên quan đến các mối quan hệ bảng:

  • Chúng tôi đã đề cập ngắn gọn về chuẩn hóa và cách sử dụng điều này để giảm dự phòng và cải thiện tính toàn vẹn dữ liệu trong cơ sở dữ liệu.
  • ERD được giới thiệu và chúng tôi đã thảo luận về cách các sơ đồ này cho phép chúng tôi mô hình hóa các mối quan hệ giữa các thực thể khác nhau.
  • Chúng tôi cũng đã xem xét các khóa, và cách các khóa chính và nước ngoài làm việc cùng nhau để tạo ra các mối quan hệ giữa các bảng khác nhau.
  • Cuối cùng, chúng tôi đã xem xét một số loại mối quan hệ khác nhau có thể tồn tại giữa các bảng và cách thực hiện chúng bằng các câu lệnh SQL.

Tóm lại, đây là danh sách các mối quan hệ phổ biến mà bạn sẽ gặp khi làm việc với SQL:

Mối quan hệThí dụ
một-một Người dùng có một địa chỉ User has ONE address
một-nhiều Một cuốn sách có nhiều đánh giá Book has MANY reviews
nhiều nhiều Người dùng có nhiều sách và một cuốn sách có nhiều người dùng user has MANY books and a book has MANY users

Trước đó trong cuốn sách này, chúng tôi đã xem xét cách truy vấn dữ liệu trong bảng cơ sở dữ liệu bằng cách sử dụng

CREATE TABLE customersaccounts(
    customer_id INT NOT NULL,
    account_id INT NOT NULL,
    PRIMARY KEY (customer_id, account_id),
    FOREIGN KEY customer_id references customers (customer_id) on delete cascade,
    FOREIGN KEY account_id  references accounts  (account_id) on delete cascade
}
7. Bây giờ dữ liệu của chúng tôi được phân chia trên nhiều bảng, làm thế nào chúng tôi có thể cấu trúc các truy vấn của mình nếu chúng tôi cần dữ liệu từ nhiều bảng cùng một lúc? Để làm điều này, chúng tôi cần tham gia các bảng của chúng tôi với nhau. Trong chương tiếp theo, chúng tôi sẽ khám phá cách thực hiện chính xác điều đó bằng cách giới thiệu một từ khóa SQL khác,
CREATE TABLE customers(
    customer_id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    address VARCHAR(20) NOT NULL,
    city VARCHAR(20) NOT NULL,
    state VARCHAR(20) NOT NULL,
    account_type ENUM( 'savings', 'credit' ) NOT NULL,
    balance FLOAT( 9 ) NOT NULL,
)
90.

Làm thế nào để bạn tạo mối quan hệ giữa hai bảng?

Tạo mối quan hệ bảng bằng cách sử dụng cửa sổ Mối quan hệ. Trên tab Công cụ cơ sở dữ liệu, trong nhóm Mối quan hệ, nhấp vào các mối quan hệ. Trên tab Thiết kế, trong nhóm Mối quan hệ, nhấp vào Thêm bảng (hoặc hiển thị bảng trong Access 2013). Chọn một hoặc nhiều bảng hoặc truy vấn và sau đó nhấp vào Thêm.On the Database Tools tab, in the Relationships group, click Relationships. On the Design tab, in the Relationships group, click Add Tables (or Show Table in Access 2013). Select one or more tables or queries and then click Add.

Làm thế nào để bạn tạo mối quan hệ giữa hai bảng trong SQL?

Sử dụng SQL Server Management Studio..
Trong Object Explorer, nhấp chuột phải vào bảng sẽ ở phía bên ngoài của mối quan hệ và chọn thiết kế. ....
Từ menu thiết kế bảng, chọn mối quan hệ. ....
Trong hộp thoại Mối quan hệ Key-Key, chọn Thêm. ....
Chọn mối quan hệ trong danh sách mối quan hệ đã chọn ..

Làm thế nào để bạn tạo mối quan hệ giữa hai bảng trong MySQL Workbench?

Làm thế nào để tạo mối quan hệ trong MySQL Workbench..
Tạo một mô hình cơ sở dữ liệu (tạo ra một mô hình mới hoặc kỹ sư đảo ngược một cơ sở dữ liệu hiện có).
Xem mô hình cơ sở dữ liệu, nhấp đúp vào bảng đầu tiên của mối quan hệ ..
Ngăn dưới cùng sẽ mở với các chi tiết bảng ..

Làm thế nào để bạn kết nối các bảng trong mysql?

Equi-join (hay còn gọi là tham gia bên trong) Công bằng tham gia các hàng từ hai hoặc nhiều bảng dựa trên sự so sánh giữa một cột cụ thể trong mỗi bảng.Cú pháp cho phương pháp này như sau: Chọn Cột_Names từ Bảng1, Bảng2 trong đó (Bảng1. Cột = Bảng2. The Equi-Join joins rows from two or more tables based on comparisons between a specific column in each table. The syntax for this approach is as follows: SELECT column_names FROM table1, table2 WHERE (table1. column = table2.