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).
Vous devez vous demander est-ce une relation de 1 à 1 ou une relation de plusieurs. C'est-à-dire que chaque compte a un client et que chaque client a un compte. Ou y aura-t-il des clients sans comptes. Votre question implique ce dernier.
Si vous souhaitez avoir une relation 1 à 1 stricte, fusionnez simplement les deux tables.
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,
)
Dans l'autre cas, la manière correcte de créer une relation entre deux tables consiste à créer une table de relations.
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
}
Ensuite, si vous avez un customer_id et que vous voulez les informations de compte, vous rejoindre sur customersaccounts et comptes:
SELECT a.*
FROM customersaccounts ca
INNER JOIN accounts a ca.account_id=a.account_id
AND ca.customer_id=mycustomerid;
En raison de l'indexation ce sera aveuglante rapide.
Vous pouvez également créer une vue qui vous donne l'effet de la table customersaccounts combiné tout en les gardant séparées
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;
« Je refuse d'étudier l'accès, je vais étudier un moteur de base de données REAL: MySQL » C'est la esprit! Félicitations = D – Metafaniel
Notez que les contraintes de clés étrangères n'implémentent pas les relations, elles implémentent l'intégrité. L'association entre account_id et customer_id dans la table des comptes implémente la relation entre les entités respectives. – reaanb
"C'est l'esprit!", Tant que c'est mysql avec InnoDB, pas MyISAM. Postgreqsl a aussi quelques fonctionnalités intéressantes sur MySQL qui valent la peine d'être vues. – jgmjgm