2009-07-17 4 views
60

Per farla breve, ho un file SQL che voglio importare come file stile skel, quindi questo sarà ripetuto, a livello di programmazione. Posso comunque modificare il file SQL, ma preferirei non toccare l'applicazione stessa.Come forzare MySQL a prendere 0 come valore di incremento automatico valido

Questa applicazione utilizza userid = 0 per rappresentare l'utente anonimo. Ha anche una voce (vuota) rilevante nel database per rappresentare questo 'utente'. Di qui, la linea della mia skel.sql simile a questa:

INSERT INTO `{{TABLE_PREFIX}}users` VALUES (0, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL); 

Il problema di questo è che uid è un campo auto_increment, per i quali, tecnicamente, 0 è un valore non valido. O almeno, se lo imposti a 0, stai praticamente dicendo a MySQL, "Per favore inserisci il prossimo ID in questo campo."

Ora, suppongo ho potuto mettere un INSERT poi un UPDATE query in mio file SQL, ma c'è un modo di raccontare MySQL in generale che sì, io in realtà voglio inserire 0 in questo campo?

risposta

74

Dalla risposta che ho ricevuto here:

È possibile utilizzare:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO' 

Quali come descritto here, impedirà MySQL da interpretare un ID INSERT/UPDATE di 0 come la sequenza successiva ID. Tale comportamento sarà limitato a NULL.

È quello che considererei un comportamento piuttosto negativo dall'applicazione. Dovrai prestare molta attenzione al fatto che venga utilizzato in modo coerente, soprattutto se si sceglie di implementare la replica in un secondo momento.

+12

Una cosa da fare attenzione: 'sql_mode' è un elenco di flag delimitato da virgole. Se esegui 'sql_mode = 'NO_AUTO_VALUE_ON_ZERO'', potresti disabilitare inavvertitamente altri flag – Kip

+0

Questa soluzione ha funzionato in pratica per me, tuttavia il mio dump includeva anche alcuni punti in cui sovrascriveva' sql_mode' nel mezzo del file sql e quindi reimpostando alla variabile 'OLD_SQL_MODE' che è stata impostata per tornare alla fine dello script. Questo stava annullando il mio 'NO_AUTO_VALUE_ON_ZERO' nel bel mezzo del mio script, rendendo questo non funziona. La mia soluzione era di creare una nuova variabile di 'INIT_OLD_SQL_MODE' che ho usato per resettare alla fine e dopo aver impostato' sql_mode' in 'NO_AUTO_VALUE_ON_ZERO', ho impostato una nuova variabile di' OLD_SQL_MODE' che quelle sostituzioni temporanee potevano essere reimpostate su –

19

Controlla la modalità DB sql con:

SELECT @@[GLOBAL|SESSION].sql_mode; 

Se è vuota o non impostata, uso:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO' 

attenzione! Se si utilizza GLOBAL, non è una modifica immediata, è necessario riavviare la connessione per applicare le impostazioni.

Quindi, se siete il ripristino dei dati da un database a un altro, per esempio, e non siete sicuri se si applica questa impostazione, utilizzare SESSION per un cambiamento immediato (si azzera quando si chiude la connessione). Al termine, inserire il valore 0 e non cambierà anche se si modifica sql_mode.

per azzerare questa modalità (e altri) usano

SET [GLOBAL|SESSION] sql_mode='' 

Zero valori di incremento automatico non sono raccomandati perché non sono impostati come default nel database MySQL.

Per ulteriori informazioni controllo mysql dev page topic su questo

5

Fail modo sicuro:

SET @@session.sql_mode = 
    CASE WHEN @@session.sql_mode NOT LIKE '%NO_AUTO_VALUE_ON_ZERO%' 
     THEN CASE WHEN LENGTH(@@session.sql_mode)>0 
      THEN CONCAT_WS(',',@@session.sql_mode,'NO_AUTO_VALUE_ON_ZERO') -- added, wasn't empty 
      ELSE 'NO_AUTO_VALUE_ON_ZERO'         -- replaced, was empty 
     END 
     ELSE @@session.sql_mode            -- unchanged, already had NO_AUTO_VALUE_ON_ZERO set 
    END 
  • Verifica se NO_AUTO_VALUE_ON_ZERO già impostato in sql_mode
  • Aggiunge sql_mode se non solo vuote
  • Imposta il sessione, consiglio di usarlo solo nelle sessioni in cui è necessario inserire uno 0
4

Se non vuoi manipolare con le variabili di MySQL, ecco un hack utile:

INSERT INTO `{{TABLE_PREFIX}}users` VALUES (-1, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL); 

E poi

UPDATE `{{TABLE_PREFIX}}users` SET id = 0 where id = -1; 

Ovviamente, questo presuppone che non si sta usando valori negativi per i tuoi ID di tabella.

+6

, non funziona se stai usando un numero intero senza segno. – fnkr