2012-03-25 16 views
5

Ho 2 tabelle, table_a e table_b.MySQL INSERT o SELECT

CREATE TABLE `table_a` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`val` varchar(64) NOT NULL, 
PRIMARY KEY (`ID`), 
UNIQUE KEY `val` (`val`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

CREATE TABLE `table_b` (
`ref_a` int(11) unsigned NOT NULL, 
`data` int(11) unsigned NOT NULL, 
UNIQUE KEY `unique_index` (`ref_a`,`data`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

Vorrei INSERIRE MASSA nella tabella B con un valore ref_a riferimento alla ID della tabella A.

Questo è quello che sto cercando di realizzare:

SELECT ID FROM table_a WHERE val = "123" 

Se il valore non esiste, quindi inserire il valore

INSERT INTO table_a(val) VALUES("123") 

Ora che ho ottenuto l'ID (assumere è "1"), voglio inserire int o table_b:

INSERT INTO table_b(ref_a, data) VALUES(1, 75) 

Il problema arriva quando voglio farlo alla rinfusa. La mia prestazione peggiorerà se si alternano tra SELEZIONA e INSERTI invece di eseguire un inserimento di massa, quindi selezionare in blocco?

che potevo fare:

INSERT INTO table_b(ref_a, data) VALUES((SELECT ID FROM table_a WHERE value="123"), 75) 

ma, cosa succede se il valore non è presente e ho bisogno di fare un inserto prima.

Non riesco a COMINCIARE A TRANSACTION e COMMIT dando che è necessario recuperare l'ID della tabella A dopo un inserimento.

posso anche fare:

  • Inserimento di massa nella tabella A.
  • Seleziona tutti gli ID dalla tabella A.
  • inserire dati nella tabella B con gli ID selezionati.

Ma sto cercando un modo alternativo.

Quale sarebbe il modo più efficiente per realizzare ciò che sto cercando di fare?

+1

Da dove provengono questi valori ('123',' 75')? Un altro tavolo? Un applicazione? Un file? –

+0

È un campo "a.ID" univoco e un campo di incremento automatico? I valori – SenorAmor

+0

123, 75 provengono da un'altra tabella - ho accesso a quei valori. a.ID è univoco, incremento automatico sì – nick

risposta

1

vi consiglio di utilizzare una stored procedure che farà il controllo per un inserto a destra: stored routine

Sarà qualcosa di simile

CREATE PROCEDURE insertdata(IN i_value VARCHAR(32), IN i_data INT(11)) 
BEGIN 
DECLARE v_insertID INT DEFAULT -1; 

SELECT ID INTO v_insertID FROM table_a WHERE value = i_value; 

IF -1 = v_insertID 
THEN 
    INSERT INTO table_a(value) VALUES(i_value); 
    SELECT ID INTO v_insertID FROM table_a WHERE value = i_value; 
END IF; 

IF -1 != v_insertID 
THEN 
    INSERT INTO table_b(ref_a, data) VALUES(v_insertID, i_data); 
END IF; 

END 

Controlliamo se è presente una voce con valore dato, se non lo creiamo, recuperiamo l'ID della voce di creazione e quindi inseriamo i dati nel table_b (se la voce è stata realmente creata)

Quindi è sufficiente chiamare la routine da php per ogni voce.Sarà molto più ottimizzato che fare tutti coloro che prova in php (che richiederà più di una chiamata mysql)

+0

questo è proprio quello di cui ho bisogno. Ho provato a creare una funzione prima ma non ci sono riuscito. Grazie! vedremo come si comporta bene – nick

3

Prima di tutto assicuratevi di avere un UNIQUE INDEX sulla colonna di valore nel table_a, poi fare un grosso INSERT IGNORE

INSERT IGNORE INTO table_a(value) VALUES("123"), ("345"), ("afasd"), ("#$#$%"), ... 

Ora sei sicuro che tutti i valori siano in table_a e puoi tranquillamente utilizzare il tuo metodo di inserimento bulk table_b.