2010-10-08 9 views
9

Ho un database in cui il vecchio codice piace inserire '0000-00-00' nelle colonne Date e DateTime invece di una data reale. Quindi ho le seguenti due domande:Blocco '0000-00-00' da MySQL Data Fields

  1. C'è qualcosa che potrei fare a livello di db per bloccare questo? So che posso impostare una colonna per essere non nullo, ma non sembra che stia bloccando questi valori zero.
  2. Qual è il modo migliore per rilevare i valori zero esistenti nei campi data? Ho circa un centinaio di tabelle con 2-3 colonne di date ciascuna e non voglio interrogarle singolarmente.

ollowup:

Il predefinito è già impostato su null. Molto tempo fa, il valore predefinito era '0000-00-00'. Alcuni codici posizionano ancora esplicitamente "0000-00-00". Preferirei forzare quel codice per generare un errore in modo da poterlo isolare e rimuovere.

+2

Non posso credere che MySQL non supporti i vincoli CHECK. Stavo per postarlo come risposta, non è un'opzione. Sempre più, capisco l'odio di MySQL. Mai usato da solo. – Dave

risposta

0

Se non importa quale data va lì (cioè fino a quando non è zero) è possibile modificare la definizione della colonna per utilizzare NOW() come predefinito. Probabilmente non è una soluzione ideale, ma lo fa soddisfare i criteri: 1) Non-null 2) Diverso da zero Sono davvero davvero non orgoglioso di questo suggerimento

0

Si potrebbe fare le colonne annullabili e hanno NULL come il valore predefinito, ma sembra che tu abbia già quello e non funzioni. Anche se ... potrebbe essere lo strumento che stai usando per visualizzare i dati non mi piace visualizzare le date NULL ... quale strumento stai usando? O il '0000-00-00' viene visualizzato in dati recuperati dal codice?

È possibile impostare un valore predefinito non null e facilmente riconoscibile come predefinito, ad esempio 1900-01-01 (presupponendo che in genere non si gestiscano date vicine a questa data).

11

C'è qualcosa che potrei fare a livello di db per bloccare questo?

Sì, abilitare la modalità NO_ZERO_DATE:

The behaviour is documented. Inoltre, potresti voler impostare la modalità anche per NO_ZERO_IN_DATE ...

Assicurati inoltre che sql_mode includa STRICT_ALL_TABLES o STRICT_TRANS_TABLES; senza questi NO_ZERO_IN_DATE dare solo un avvertimento, ma inserire riesce ancora.

Qual è il modo migliore per rilevare i valori zero esistenti nei campi data? Ho circa un centinaio di tabelle con 2-3 colonne di date ciascuna e non voglio interrogarle singolarmente.

Le colonne separate indicano che devono essere verificate singolarmente - nulla che tu possa fare al riguardo.

+0

(funziona solo quando si inseriscono nuovi dati - non è di grande aiuto se si ha un database pieno di dati non validi) – symcbean

0

Supponendo che non sia possibile correggere facilmente i dati e "SET sql_mode = 'NO_ZERO_DATE';", è possibile creare una vista sul tavolo ...

CREATE VIEW filter AS 
SELECT other_column, 
CASE 
    WHEN realtable.dodgy_date = 0 THEN NULL 
    ELSE realtable.dodgy_date 
END AS dodgy_date 
FROM realtable; 
0

A trigger può essere utilizzato per applicare i valori per le colonne.

0

impostare il timestamp di default è forse un'opzione per voi, tavola degli impieghi dichiarazione cambiamento per questo:

ALTER TABLE mytable CHANGE date_update timestamp NOT NULL DEFAULT CURRENT_DATE() 

MySQL CURRENT_DATE() documentation at w3c resource

Per rimuovere Zero Date e sostituirli con per esempio la data corrente fare questo:

UPDATE mytable SET date_update = CURRENT_DATE() where date_update = "0000-00-00" 
0

Questa è l'innesco che uso:

delimiter // 
CREATE TRIGGER bad_date BEFORE INSERT ON some_table 
    FOR EACH ROW 
     BEGIN 
      IF NEW.the_date='0000-00-00' THEN 
       SET NEW.the_date= CURDATE(); 
      END IF; 
     END;// 

Se gli aggiornamenti sono una preoccupazione, aggiungere un trigger separato (prima dell'aggiornamento) per fare la stessa cosa.