Question

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,
    PRIMARY KEY ( customer_id )
)

Comment créer une "relation" entre les deux tables? Je souhaite qu'un compte client soit attribué à chaque compte (pour indiquer à qui il appartient).

Était-ce utile?

La solution

Si les tables sont innodb, vous pouvez le créer comme suit:

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. Consultez ici pour plus d'informations.

Autres conseils

comme dit ehogue, mettez ceci dans votre CREATE TABLE

FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 

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 les outils d'interface graphique de MySQL , ce qui vous donne plus de "visuels" interface pour travailler avec votre base de données. Le véritable avantage de cette méthode (par rapport à la méthode d’Access) est qu’après avoir conçu votre table via l’interface graphique, il vous indique le code SQL qu’il va exécuter, ce qui vous permet d’en tirer des enseignements.

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 point.

Si vous souhaitez avoir une relation stricte 1 pour 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 bonne façon 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 du 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 donne l’effet de la table combinée des comptes clients 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;

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

customer_id INT( 4 ) NOT NULL ,

le faire

customer_id INT( 10 ) NOT NULL ,

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

Certains moteurs MySQL supportent les clés étrangères. Par exemple, InnoDB peut établir des contraintes en fonction de 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, à l'exception de vos diagrammes et de 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);

Voici quelques ressources qui vous 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

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. N’oubliez pas d’arrêter les services Apache et mySQL lorsque vous avez terminé: ils peuvent ouvrir des ports, ce qui peut vous exposer à des menaces de piratage ou de malveillance.

Une des règles à connaître est que la colonne de la table à laquelle vous voulez faire référence doit être avec le même type de données que La table de référencement. 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 les objectifs que vous souhaitez atteindre dans mysql.

Bellow est le code essayez-le bien que les premières personnes à répondre à cette question ils ont à 100% fourni d'excellentes réponses et merci de 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; 
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)
);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top