web-dev-qa-db-fra.com

MySQL - Comment insérer dans une table qui a une relation plusieurs-à-plusieurs

J'ai une table de personnes. Chaque personne a une propriété et de nombreuses personnes peuvent avoir une certaine propriété. Il s'agit donc d'une relation plusieurs-à-plusieurs. Voici le schéma:

CREATE TABLE persons (
  person_id int(11) NOT NULL AUTO_INCREMENT,
  firstname varchar(30) NOT NULL,
  lastname varchar(30) NOT NULL,
  PRIMARY KEY (person_id)
);

CREATE TABLE properties (
  property_id int(11) NOT NULL AUTO_INCREMENT,
  property varchar(254) NOT NULL UNIQUE,
  PRIMARY KEY (property_id)
);

CREATE TABLE has_property (
  person_id int(11) NOT NULL,
  property_id int(11) NOT NULL,
  PRIMARY KEY (person_id,property_id),
  FOREIGN KEY (person_id) REFERENCES persons (person_id),
  FOREIGN KEY (property_id) REFERENCES properties (property_id)
);

Disons maintenant que je veux insérer dans la base de données cette personne:

  • prénom: 'John'
  • nom: 'Doe'
  • propriétés: 'property_A', 'property_B', 'property_C'

les personnes

+-----------+-----------+----------+
| person_id | firstname | lastname |
+-----------+-----------+----------+
|         1 | John      | Doe      |
+-----------+-----------+----------+

propriétés

+-------------+------------+
| property_id |  property  |
+-------------+------------+
|           1 | property_A |
|           2 | property_B |
|           3 | property_C |
+-------------+------------+

has_property

+-----------+-------------+
| person_id | property_id |
+-----------+-------------+
|         1 |           1 |
|         1 |           2 |
|         1 |           3 |
+-----------+-------------+

Jusqu'à présent, la meilleure chose à laquelle j'ai pensé est de faire un insert régulier dans le tableau des personnes:

INSERT INTO persons (firstname,lastname) VALUES ('John','Doe');

puis faites une sélection pour trouver l'identifiant de la personne que je viens d'insérer

SELECT person_id FROM persons WHERE firstname='John' AND lastname='Doe';

afin d'insérer dans les deux autres tables (car j'ai besoin de connaître le person_id). Mais je pense qu'il doit y avoir une meilleure façon, n'est-ce pas?

22
Christos Baziotis

Voici ce que j'ai fini par faire. J'espère que ça aide quelqu'un.

INSERT INTO persons (firstname,lastname) VALUES ('John','Doe');
SET @person_id = LAST_INSERT_ID();

INSERT IGNORE INTO properties (property) VALUES ('property_A');
SET @property_id = LAST_INSERT_ID();
INSERT INTO has_property (person_id,property_id) VALUES(@person_id, @property_id);

INSERT IGNORE INTO properties (property) VALUES ('property_B');
SET @property_id = LAST_INSERT_ID();
INSERT INTO has_property (person_id,property_id) VALUES(@person_id, @property_id);

INSERT IGNORE INTO properties (property) VALUES ('property_C');
SET @property_id = LAST_INSERT_ID();
INSERT INTO has_property (person_id,property_id) VALUES(@person_id, @property_id);
35