web-dev-qa-db-fra.com

Comment créer des relations dans MySQL

En classe, nous étudions tous des bases de données et tout le monde utilise Access. Lassé de 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.

J'ai réussi à créer des bases de données et des tables, mais maintenant, 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 créer une "relation" entre les deux tables? Je souhaite que chaque compte se voit attribuer un identifiant client (pour indiquer à qui il appartient).

83
Josh Hunt

Si les tables sont innodb, vous pouvez le créer 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 prend pas en charge la clé étrangère. Regardez ici pour plus d'informations. 

89
Eric Hogue

comme ehogue l'a dit, mettez ceci dans votre CREATE TABLE

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

sinon, si vous avez déjà créé la table, 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;

Un bon moyen de commencer à apprendre ces commandes consiste à utiliser MySQL GUI Tools , qui vous donne une interface plus "visuelle" pour utiliser votre base de données. Le véritable avantage de cette méthode (par rapport à la méthode d’Access) est qu’après la conception de votre table via l’interface graphique, elle vous indique le code SQL qu’elle va exécuter et vous permet donc de tirer des enseignements.

71
nickf
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 s'il s'agit d'une relation de 1 à 1 ou de 1 sur plusieurs. Autrement dit, chaque compte a-t-il un client et chaque client a-t-il un compte? Ou y aura-t-il des clients sans compte? Votre question implique ce dernier.

Si vous voulez avoir une relation stricte 1 à 1, il suffit de fusionner 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 souhaitez les informations de compte, vous vous inscrivez sur les comptes clients et les 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 extrêmement rapide.

Vous pouvez également créer une vue qui vous donne l’effet de la table des comptes clients combinés tout en les séparant.

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;
11
user3842431

Ajoutant au commentaire par ehogue, vous devriez faire correspondre la taille des clés sur les deux tables. Plutôt que 

customer_id INT( 4 ) NOT NULL ,

fais-le

customer_id INT( 10 ) NOT NULL ,

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

9
Zak

Certains moteurs MySQL supportent 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 d'une table ayant des personnes à charge 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, sauf vos diagrammes et vos requêtes.

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

SELECT a, b from table1 LEFT JOIN table2 USING (common_field);
6
Gary Richardson

Voici quelques ressources qui vous aideront à démarrer: http://www.anchor.com.au/hosting/support/CreatingAQuickMySQLRelationalDatabase et http://code.tutsplus.com/articles/sql- pour-débutants-partie-3-base-relations-net - 8561

Également, comme d'autres l'ont dit, utilisez une interface graphique - essayez de télécharger et d'installer Xampp (ou Wamp), qui exécute un logiciel serveur (Apache et MySQL) sur votre ordinateur. Ensuite, lorsque vous accédez à // localhost dans un navigateur, sélectionnez PHPMyAdmin pour commencer à utiliser visuellement une base de données mySQL. Comme mentionné ci-dessus, innoDB a été utilisé pour vous permettre de nouer les relations souhaitées. Il est 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é: ils peuvent ouvrir des ports susceptibles de vous exposer à des menaces de piratage/malveillantes.

2
user3659515

Une des règles que vous devez savoir est que la colonne de la table à laquelle vous voulez faire référence doit avoir le même type de données que La table 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 prend en charge ce que vous voulez réaliser avec mysql.

Ci-dessous, le code essayez-le bien que les premières personnes à répondre à cette question 100% d'entre elles ont fourni d'excellentes réponses et, s'il vous plaît, considérez-les toutes.

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; 
1
Musa
create table departement(
    dep_id      int primary key auto_increment,
    dep_name    varchar(100) not null,
    dep_descriptin      text,
    dep_photo       varchar(100) not null,
    dep_video       varchar(300) not null
);

create table newsfeeds(
    news_id         int primary key auto_increment,
    news_title      varchar(200) not null,
    news_description    text,
    news_photo          varchar(300) ,
    news_date           varchar(30) not null,
    news_video          varchar(300),
    news_comment        varchar(200),
    news_departement    int foreign key(dep_id) references departement(dep_id)
);
0
Anayat