2013-10-31 53 views
15

Ho una tabella di persone. Ogni persona ha una proprietà e molte persone possono avere una certa proprietà. Quindi questa è una relazione molti-a-molti. Questo è lo schema:MySQL - Come inserire nella tabella che ha relazione molti-a-molti

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

Ora Diciamo che voglio inserire nel database di questa persona:

  • Cognome: 'John'
  • Cognome: 'Doe'
  • proprietà:' property_A', 'property_B', 'property_C'

persone

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

proprietà

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

has_property

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

Finora la cosa migliore che ho pensato è quello di fare un inserto regolare nella tabella persone:

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

e poi fare una selezione per trovare l'ID della persona che ho appena inserito

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

per inserire nelle altre due tabelle (perché ho bisogno di conoscere la person_id). Ma penso che ci debba essere un modo migliore, non è vero?

+2

È possibile utilizzare 'SELEZIONA LAST_INSERT_ID()' per recuperare l'ID dell'ultima riga inserita –

+2

Per coloro che possono dire che questo è un duplicato, ho letto questa domanda http://stackoverflow.com/questions/ 17767973/inserimento-dati-in-un-tavolo-che-ha-un-molti-a-molti-relazione ma era vago e non mi ha aiutato. –

risposta

23

Ecco cosa ho fatto. Spero che aiuti qualcuno.

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