2011-02-09 22 views
5

sto provando a creare query più robuste MySQL e impara nel processo. Attualmente sto attraversando un periodo difficile cercando di cogliere la sintassi ON DUPLICATE KEY e possibili usi.Istruzione mySQL condizionale. Se true UPDATE, se false INSERT

Ho un INSERT query che voglio INSERT solo se non v'è alcun record con lo stesso ID e il nome, altrimenti UPDATE. ID e il nome non è UNIQUE ma ID è indicizzato. ID non è UNIQUE perché fa riferimento a un altro record da un'altra tabella e voglio avere più record in questa tabella che fanno riferimento a quel record specifico dell'altro tavolo.

Come posso utilizzare ON DUPLICATE KEY-INSERT solo se non v'è alcuna traccia di quel ID e il nome già impostato il resto UPDATE quel record?

mi può facilmente raggiungere questo obiettivo con un paio di QUERIES e quindi avere PHP fare la parte IFELSE, ma voglio sapere come LIMIT la quantità di QUERIES mando a MySQL.

risposta

7

UPDATE: Nota è necessario utilizzare IF EXISTS anziché IS NULL come indicato nella risposta originale.

codice per creare stored procedure per incapsulare ogni logica e verificare se esistono Sapori:

DELIMITER // 

DROP PROCEDURE `GetFlavour`// 
CREATE PROCEDURE `GetFlavour`(`FlavourID` INT, `FlavourName` VARCHAR(20)) 
BEGIN 
IF EXISTS (SELECT * FROM Flavours WHERE ID = FlavourID) THEN 
UPDATE Flavours SET ID = FlavourID; 
ELSE 
INSERT INTO Flavours (ID, Name) VALUES (FlavourID, FlavourName); 
END IF; 
END // 

DELIMITER ; 

ORIGINALE:

Si potrebbe utilizzare questo codice. Verificherà l'esistenza di un particolare record e, se il recordset è NULL, passerà e inserirà il nuovo record per te.

IF (SELECT * FROM `TableName` WHERE `ID` = 2342 AND `Name` = 'abc') IS NULL THEN 
INSERT INTO `TableName` (`ID`, `Name`) VALUES ('2342', 'abc'); 
ELSE UPDATE `TableName` SET `Name` = 'xyz' WHERE `ID` = '2342'; 
END IF; 

Sono un po 'arrugginito sulla mia sintassi MySQL, ma che il codice dovrebbe almeno ottenere la maggior parte del tragitto, piuttosto che utilizzare ON DUPLICATE KEY.

+0

Ottenere un errore con questo: si ha un errore nella sintassi SQL; controlla il manuale che corrisponde alla tua versione del server MySQL per la sintassi corretta da usare vicino a 'IF (SELEZIONA * DA sapori WHERE id =' 1 'AND Name =' BerryBlue ') È NULL THEN' alla riga 1 –

+0

@Vitaliy - I ' ho aggiornato il mio codice. Vedi se ti aiuta affatto. In caso contrario, provare a inserire l'istruzione INSERT sulla stessa riga dell'istruzione IF. –

+0

Provato già. Inoltre invertito la logica e ancora mi dà un errore di sintassi. Ho anche sostituito tutti i vars di PHP con valori statici senza fortuna. –

2

Perché non utilizzare solo una stored procedure, quindi è possibile incorporare tutta la logica che esiste in più si dispone di una parte di codice riutilizzabile (ad esempio il proc memorizzato) che è possibile utilizzare in altre applicazioni. Infine, questo richiede solo un round trip sul server per chiamare il proc memorizzato.

+0

Sono terribilmente nuovo a SQL e non so come eseguire le stored procedure. Ho molto da imparare. –

4

id e nome non sono univoci ma l'ID è indicizzato. id non riservate

Come posso usare su KEY duplicato INSERT solo se non v'è alcun record con che id e il nome già impostati altro UPDATE quel record?

Non è possibile. ON DUPLICATE KEY UPDATE richiede una chiave univoca o primaria per determinare quale riga aggiornare. È meglio avere PHP nella parte IF ELSE.

edit:

Se la combinazione di nome e l'ID dovrebbe essere unico, è possibile creare un indice univoco a più colonne. Da lì è possibile utilizzare ON DUPLICATE KEY UPDATE.

+1

+1 per spiegare questo fatto. Sembra che abbia una colonna id autoincrementante. In questo caso, deve solo selezionare quindi inserire all'interno di una transazione. –

+0

In questo modo avrei bisogno di due query. Uno per SELEZIONARE i campi e poi un altro per AGGIORNARE/INSERIRE. Sto cercando di vedere se posso farlo in una sola query. Non sto autoincrementando la colonna id. L'ID fa riferimento a un ID univoco di un altro record su un'altra tabella. –

+2

Sfortunatamente senza un indice UNIQUE, non penso che tu possa. MySQL internamente prova prima l'inserto e poi rileva un 'errore chiave duplicato' e quindi esegue l'aggiornamento. SOSTITUIRE funziona allo stesso modo. Sembra che forse id e nome combinati potrebbero costituire un indice UNIQUE? In tal caso, crea quell'indice combinato e ON DUPLICATE KEY dovrebbe funzionare per te. – mluebke