2015-06-15 11 views
5

MYSQL domanda dell'aggiornamento invia stessa risposta in diverse situazioniMYSQL dà stessa risposta '0 righe interessate' in situazioni diverse

"0 righe interessate. (Query prese 0,0789 sec)"

1) dove clausola non corrisponde

2) where è abbinato ma il valore fornito è uguale al valore esistente

es:
supporre che user_id = '86' non è esiste nella tabella

UPDATE `undergraduate` set `faculty` = 'Efac' WHERE `user_id` = '86' 

scontato che user_id = '86' è esiste. Ma il valore 'EFAC' è già in là

UPDATE `undergraduate` set `faculty` = 'Efac' WHERE `user_id` = '86' 

domanda è: qual è il modo migliore per identificare in modo significativo sia le condizioni?

sto usando: MYSQL:

+-------------------------+ 
| @@version    | 
+-------------------------+ 
| 5.6.19-0ubuntu0.14.04.1 | 
+-------------------------+ 

PHP: 5.5.9-1 (DOP)

risposta

4

MySQL Command Line

Se si utilizza la riga di comando di MySQL strumento l'output dato ti permetterà di differenziare i due scenari.

Se la voce non esiste:

+---------------+---------+ 
| user_id  | faculty | 
+---------------+---------+ 
| 80   | abc  | 
+---------------+---------+ 

mysql> UPDATE `undergraduate` set `faculty` = 'Efac' WHERE `user_id` = '86'; 
Query OK, 0 rows affected (0.00 sec) 
Rows matched: 0 Changed: 0 Warnings: 0 

Se la voce non esiste, ma non viene aggiornato:

+---------------+---------+ 
| user_id  | faculty | 
+---------------+---------+ 
| 80   | abc  | 
| 86   | Efac | 
+---------------+---------+ 

mysql> UPDATE `undergraduate` set `faculty` = 'Efac' WHERE `user_id` = '86'; 
Query OK, 0 rows affected (0.00 sec) 
Rows matched: 1 Changed: 0 Warnings: 0 

Se la voce esiste, e viene aggiornato:

+---------------+---------+ 
| user_id  | faculty | 
+---------------+---------+ 
| 80   | abc  | 
| 86   | bcd  | 
+---------------+---------+ 

mysql> UPDATE `undergraduate` set `faculty` = 'Efac' WHERE `user_id` = '86'; 
Query OK, 0 rows affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

PHP - DOP

PDO purtroppo non fornisce un meccanismo per far corrispondere entrambe le righe alle righe e per una query, ma è possibile scegliere quale si desidera. Il default è di restituire il numero di righe cambiato, ma l'opzione può essere specificato sulla connessione per restituire il numero di righe corrispondenti invece:

$db = new PDO('mysql:dbname=database;host=host', 'username', 'password', array(
    PDO::MYSQL_ATTR_FOUND_ROWS => true 
)); 

PHP - MySQLi

Le funzioni MySQLi può fare lo stesso come DOP in termini di scelta tra abbinati e aggiornati:

$db = mysqli_init(); 
$db->real_connect('host', 'username', 'password', 'database', '3306', null, MYSQLI_CLIENT_FOUND_ROWS); 

Ma si può anche chiamare la funzione mysqli_info()/$db->info() (vedi http://php.net/manual/en/mysqli.info.php) e restituirà una stringa con le righe abbinate/aggiornati che è quindi possibile analizzare:

Records: 3 Duplicates: 0 Warnings: 0 
+0

Scusa se ho dimenticato di menzionare che uso PHP non lo strumento da riga di comando, la domanda è stata aggiornata – Alupotha

+0

@ Tech-Sira Ho aggiornato la mia risposta con i dettagli su come ottenere queste informazioni in PHP. – Eborbob

+0

Grazie, questo è quello che mi aspettavo risposta! – Alupotha

1

è necessario utilizzare l'API C di MySQL (o un involucro di quello). Da MySQL docs:

UPDATE restituisce il numero di righe effettivamente modificate. La funzione API mysql_info() C restituisce il numero di righe corrispondenti a corrispondenti e il numero di avvisi verificatisi durante lo UPDATE.

e cliccando sul mysql_info revealed:

UPDATE

formato stringa: Righe trovati: 40 cambiato: 40 Avvertenze: 0

che assomiglia a qualcosa puoi analizzare :)

EDIT BK435 ha detto che non è chiaro se ho risposto alla domanda di OP. Penso di aver fatto:. Non è possibile ottenere queste informazioni dalle righe restituite colpiti da solo (ovvio, dal momento che 0==0, ma è necessario utilizzare mysql_info

+0

@ BK435: Penso di aver risposto chiaramente; ma dal momento che l'hai chiesto: aggiorna la mia risposta :) –

+0

invece di farlo posso semplicemente eseguire una query di selezione con la stessa clausola where e ottenere il conteggio delle righe interessato, ma ho pensato che potrebbe esserci un modo migliore rispetto all'esecuzione di due query. Sto cercando il modo più semplice .. ma potrebbe essere che ho torto – Alupotha

+0

Quello che ho proposto è il modo più semplice, secondo la ** documentazione ufficiale **. –

Problemi correlati