2008-11-04 10 views
82

En classe, nous étudions tous les bases de données et tout le monde utilise Access. Ennuyé par cela, j'essaie de faire ce que le reste de la classe fait, mais avec des commandes SQL brutes avec MySQL au lieu d'utiliser Access.Comment créer des relations dans MySQL

J'ai réussi à créer des bases de données et des tables, mais comment établir une relation entre deux tables?

Si j'ai mes deux tables comme ceci:

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) 
) 

et

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, 
) 

Comment puis-je créer une 'relation' entre les deux tables? Je veux que chaque compte soit assigné un customer_id (pour indiquer qui en est le propriétaire).

+26

« 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

+1

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

+1

"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

Répondre

82

Si les tables sont vous pouvez créer innodb comme ceci:

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), 
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
) ENGINE=INNODB; 

Vous devez spécifier que les tables sont InnoDB, car le moteur MyISAM ne supporte pas la clé étrangère. Regardez here pour plus d'informations.

9

Ajout sur le commentaire par ehogue, vous devez faire correspondre la taille des touches sur les deux tables. Plutôt que

customer_id INT(4) NOT NULL , 

rendent

customer_id INT(10) NOT NULL , 

et assurez-vous que votre colonne int dans la table des clients est int (10) également.

+1

Bon point, je n'ai pas vu les tailles des champs. –

+0

pourquoi? fillerfillerfiller – stackPusher

62

comme ehogue dit, mettre ceci dans votre CREATE TABLE

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

alternativement, si vous avez déjà la table créée, utilisez une commande ALTER TABLE:

ALTER TABLE `accounts` 
    ADD CONSTRAINT `FK_myKey` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`customer_id`) ON DELETE CASCADE ON UPDATE CASCADE; 

Une bonne façon de commencer l'apprentissage Ces commandes utilisent le MySQL GUI Tools, qui vous donne une interface plus "visuelle" pour travailler avec votre base de données. Le véritable avantage de cela (par rapport à la méthode d'Access), c'est qu'après avoir conçu votre table via l'interface graphique, il vous montre le SQL qu'il va exécuter, et vous pouvez donc en tirer des leçons.

+1

Votre réponse est la meilleure solution – Omar

6

Certains moteurs MySQL prennent en charge les clés étrangères. Par exemple, InnoDB peut établir des contraintes basées sur des clés étrangères. Si vous essayez de supprimer une entrée dans une table qui a des dépendances dans une autre, la suppression échouera.

Si vous utilisez un type de table dans MySQL, tel que MyISAM, qui ne prend pas en charge les clés étrangères, vous ne liez les tables nulle part à l'exception de vos diagrammes et requêtes.

Par exemple, dans une requête vous relier deux tables dans une instruction select avec une jointure:

SELECT a, b from table1 LEFT JOIN table2 USING (common_field); 
1

L'une des règles que vous devez savoir est que la colonne de table que vous voulez faire référence à doit être avec le même type de données que Le tableau de référence. 2 Si vous décidez d'utiliser mysql, vous devez utiliser InnoDB Engine car selon votre question, c'est le moteur qui supporte ce que vous voulez réaliser dans mysql.

Ci-dessous le code essayez-le si les premières personnes à répondre à cette question ils 100% fourni de bonnes réponses et s'il vous plaît les considérer tous.

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) 
)ENGINE=InnoDB; 

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, 
    PRIMARY KEY (account_id), 
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
)ENGINE=InnoDB; 
2

Voici quelques ressources qui aideront à démarrer: http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase et http://code.tutsplus.com/articles/sql-for-beginners-part-3-database-relationships--net-8561

également que d'autres ont dit, utilisez une interface graphique - essayez de télécharger et d'installer Xampp (ou Wamp) qui lance le serveur-logiciel (Apache et mySQL) sur votre ordinateur. Ensuite, lorsque vous accédez à // localhost dans un navigateur, sélectionnez PHPMyAdmin pour commencer à travailler visuellement avec une base de données mySQL. Comme mentionné ci-dessus, utilisé innoDB pour vous permettre de faire des relations comme vous l'avez demandé. Cela rend plus facile de voir ce que vous faites avec les tables de la base de données. Rappelez-vous simplement d'arrêter les services Apache et mySQL lorsque vous avez terminé - ceux-ci peuvent ouvrir des ports qui peuvent vous exposer au piratage/menaces malveillantes.

10
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; 
+1

Je pense que vous vouliez dire «ca.» pas «ac» (3 places). –

Questions connexes