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 rằng đây là mối quan hệ 1-1 hay mối quan hệ có 1 không 2. Tức 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ó những khách hàng không có tài khoản. Câu hỏi của bạn ngụ ý sau.
Nếu bạn muốn có mối quan hệ 1-1 nghiêm ngặt, 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 một bảng 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ó customer_id và muốn có thông tin tài khoản, bạn tham gia trên các tài khoản và tài khoản khách hàng:
SELECT a.*
FROM customersaccounts ca
INNER JOIN accounts a ca.account_id=a.account_id
AND ca.customer_id=mycustomerid;
Bởi vì việc lập chỉ mục này sẽ rất nhanh chóng.
Bạn cũng có thể tạo CHẾ ĐỘ XEM để tạo cho bạn hiệu ứng của bảng tài khoản khách hàng được kết hợp trong khi vẫn tách chúng ra
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;