errore mysql 1364 Il campo non ha valori predefiniti


113

Il mio tavolo sembra

create table try ( name varchar(8), CREATED_BY varchar(40) not null);

e poi ho un trigger per popolare automaticamente il campo CREATED_BY

create trigger autoPopulateAtInsert BEFORE INSERT on try for each row set new.CREATED_BY=user();

Quando faccio un inserto usando

insert into try (name) values ('abc');

l'inserimento viene effettuato nella tabella ma ricevo ancora il messaggio di errore

Field 'CREATED_BY' doesn't have a default value Error no 1364

C'è un modo per sopprimere questo errore senza rendere il campo annullabile E senza rimuovere il trigger? Altrimenti il ​​mio ibernazione vedrà queste eccezioni (anche se gli inserimenti sono stati effettuati) e quindi l'applicazione andrà in crash.

Risposte:


28

Imposta un valore predefinito per Created_By(es: vuoto VARCHAR) e il trigger aggiornerà comunque il valore.

create table try ( 
     name varchar(8), 
     CREATED_BY varchar(40) DEFAULT '' not null
);

Come impostare un valore predefinito in un programma Java?
Nagarajan Shanmuganathan

1
hai bisogno di un valore predefinito nella definizione della tabella (crea tabella try (name varchar (8), CREATED_BY varchar (40) DEFAULT '' non null))
KinSlayerUY

Questo non risolve il problema principale. Vedi la risposta molto più ampia di Phyxx di seguito.
csvan

3
@csvan risposta di Phyxx non affronta la causa principale sia perché la causa principale era un bug in MySQL che è stato fissato in v5.7.1 - vedere la risposta B98: stackoverflow.com/a/29854279/5389997 rimozione modalità SQL strict_trans_table rende MySQL più soggetto a errori di qualità dei dati, quindi rimuoverlo non è un buon consiglio.
Shadow

205

Ciò è causato dalla STRICT_TRANS_TABLESmodalità SQL definita in

% PROGRAMDATA% \ MySQL \ MySQL Server 5.6 \ my.ini

file. Rimuovere questa impostazione e riavviare MySQL dovrebbe risolvere il problema.

Vedi https://www.farbeyondcode.com/Solution-for-MariaDB-Field--xxx--doesn-t-have-a-default-value-5-2720.html

Se la modifica di quel file non risolve il problema, vedere http://dev.mysql.com/doc/refman/5.6/en/option-files.html per altre possibili posizioni dei file di configurazione.


5
Puoi eseguire una query SQL all'interno del tuo strumento di gestione del database, come phpMyAdmin: -- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
anasanjaria

5
ma forse vuoi STRICT_TRANS_TABLES?
Andrew

nel mio caso il campo è di tipo DATETIME con il valore predefinito impostato come NULL, e vedo ancora lo stesso errore, ho due schemi sullo stesso database. uno per Staging, un altro per la produzione, con le stesse strutture dei tavoli. Funziona in uno schema, ma non in un altro con esattamente la stessa struttura di tabella in entrambi. Sono sconcertato .. Non sono sicuro che sia un problema con STRICT_TRANS_TABLES
dresh

1
Ho rimosso STRICT_TRANS_TABLES da /etc/my.cnf - nella riga che inizia con sql_mode - e ho riavviato il servizio mysql e il problema è scomparso.
Mike Volmar

92

Apri phpmyadmin e vai alla scheda "Altro" e seleziona il sottomenu "Variabili". Scorri verso il basso per trovare la modalità sql. Modifica la modalità sql e rimuovi "STRICT_TRANS_TABLES" Salvalo.


22
Questa domanda riguarda MySQL e non fa alcuna menzione di phpmyadmin. Per favore, non dare per scontato che tutti lo abbiano in esecuzione.
Chris

2
@ jackadams49 Questa modifica non si applica. Potete consigliarmi cosa avete fatto per far sopravvivere questa modifica a un riavvio del sistema?
LD James

8
@ jackadams49 per farlo rimanere`` sudo nano /etc/mysql/my.cnfaggiungi [mysqld] sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", salva ed esci e riavvia mysql sudo service mysql restart
maan81

1
Per aggiungere, ho dovuto cambiare i valori di sql_modea null, cioè sql_mode = ""per altri errori simili.
maan81

Abbiamo recentemente aggiornato il nostro MySQL a 5.7. Stavamo affrontando troppi problemi. Questo ha funzionato per me. Mi ha salvato la giornata.
Allievo

38

In phpmyadmin, eseguire le seguenti operazioni:

select @@GLOBAL.sql_mode

Nel mio caso, ottengo quanto segue:

ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES ,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Copia questo risultato e rimuovi STRICT_TRANS_TABLES. Quindi eseguire quanto segue:

set GLOBAL sql_mode='ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

sì, ma per questo dovrai accedere a phpmyadmin con l'account di root :) super account
user889030

1
dopo aver trascorso quattro ore, questa soluzione ha funzionato per me in Ubuntu 16.04. Grande !
Waleed Ahmed

3
non ti serve phpmyadminaffatto, usa questi comandi sulla mysqlriga di comando.
gustyaquino

4
questo verrà ripristinato ai valori predefiniti dopo il riavvio di mysql / server / pc. È necessario modificare /etc/mysql/mysql.conf.d/mysqld.cnf, e dopo [mysqld] aggiunge questa linea: sql_mode = 'ONLY_FULL_GROUP_BY, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_UBSTITUTION'
waza123

soluzione di @ waza123, questa funziona per me dopo l'aggiornamento a mysql 5.7.20. grazie
fredy kardian

28

Quando ho avuto lo stesso problema con mysql5.6.20 installato con Homebrew, l'ho risolto andando in my.cnf

nano /usr/local/Cellar/mysql/5.6.20_1/my.cnf

Trova la linea che sembra così:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

Commenta sopra la riga e riavvia il server mysql

mysql.server restart

Errore andato!


15

Esegui la console mysql:

mysql -u your_username -p

, seleziona database:

USE your_database;

ed esegui (anche dalla console mysql):

SET GLOBAL sql_mode='';

Ciò disattiverà la modalità rigorosa e mysql non si lamenterà più.

Per chiarire le cose: la definizione del tuo database dice "questo campo deve avere un valore predefinito definito", e facendo i passaggi dall'alto dici a MySql "sì, ignoralo". Quindi, se vuoi solo fare qualche soluzione rapida localmente, questa soluzione è ok. Ma generalmente dovresti investigare nella definizione del tuo database e controllare se il campo ha davvero bisogno del valore predefinito e, in tal caso, impostarlo. E se il valore predefinito non è necessario, questo requisito dovrebbe essere rimosso per avere una situazione pulita.


Sì, non aggiungere un valore predefinito rimuovi solo le regole, ottima soluzione (implicito sarcasmo) non farlo mai come un grande cattivo esempio. Tuttavia, risolve il problema
zardilior

1
Sì, d'accordo con te. Ma a volte hai un progetto di altre persone, che funziona bene, cioè in produzione (dove la modalità rigorosa non è impostata) e vuoi solo aggiungere qualche piccola funzionalità o correzione di bug, lavorando in locale. Non vuoi combattere i draghi, solo per far funzionare quella cosa da * n. :)
MilanG

per quello scenario sono d'accordo
zardilior

@zardilior qual è il problema? il valore predefinito viene scelto in base al tipo di colonna se la regola viene rimossa .. Non vedo nulla di sbagliato in questo: / quella regola è piuttosto dura senza motivo.
Reloecc

1
Non è per niente duro, ti costringe solo a dichiarare un valore predefinito o fornire un valore, anche la modalità rigorosa funziona per molte più cose, quindi disabilitarla, invece di dichiarare un deault sulla colonna o passare il valore, è davvero terribile mor ein prod. Disabiliti uno dei buoni caratteri di mysql lì
zardilior

13

Come altri hanno detto, ciò è causato dalla STRICT_TRANS_TABLESmodalità SQL.

Per verificare se la STRICT_TRANS_TABLESmodalità è abilitata:

SHOW VARIABLES LIKE 'sql_mode';

Per disabilitare la modalità rigorosa:

SET GLOBAL sql_mode='';

Rimosso manualmente "STRICT_TRANS_TABLES" dalle variabili> sql_mode per il test e ha funzionato!
Prem popatia

1
Mi hai salvato la giornata.
ombelicale

Per me dopo aver eseguito il secondo comando e controllato sql_mode (1 ° comando) non fa nulla. Anche dopo aver riavviato il servizio mysql. Debian 9
trainoasis

12

Prima di ogni azione di inserimento che ho aggiunto sotto la riga e ho risolto il mio problema,

SET SQL_MODE = '';

Non sono sicuro che questa sia la soluzione migliore,

SET SQL_MODE = ''; INSERT INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');

1
Non è necessario farlo prima di ogni azione di inserimento, basta farlo una volta all'inizio dello script, subito dopo essersi connessi al database, e ogni query di inserimento funzionerà senza l'errore "Il campo non ha un valore predefinito".
José Carlos PHP

Questa soluzione va bene perché non è necessario modificare le tabelle (potrebbero esserci molti campi da modificare).
José Carlos PHP

11

Funziona e testato Copia nel file di configurazione: /etc/mysql/my.cnf OPPURE /bin/mysql/my.ini

[mysqld]
port = 3306
sql-mode=""

quindi riavvia MySQL


9

Modifica la tua query e aggiungi "IGNORE" come:

INSERT IGNORE INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');

questo ha funzionato per me: il mio script PHP si interrompeva, ma con IGNORE, si limita a inserire una nuova riga! Ora, quanto è "sicuro" avere IGNORE codificato nella query PHP-MYSQL? Lo uso per aggiungere automaticamente le righe, per il nuovo "giorno", dove prima non esisteva
Levchik

@Levchik Quando usi IGNORE, quindi invece di un errore, MySQL emette un avviso quando si verifica un errore, invece, e proverà a completare l'istruzione in qualche modo: mysqltutorial.org/mysql-insert-ignore
Stefan

6

Per gli utenti di Windows WampServer :

WAMP> MySQL> my.ini

cerca file per sql-mode=""

Rimuovi il commento.


2
Nella mia versione ho dovuto cambiare: sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"a sql-mode="". La rimozione dei commenti ha sql-mode=""causato l'errore.
Julian

5

Ciò sembra essere causato da un bug di vecchia data (dal 2004) (# 6295) in MySQL , intitolato

I trigger non vengono elaborati per le colonne NOT NULL .

È stato presumibilmente corretto nella versione 5.7.1 di MySQL (Changelog, ultima voce) nel 2013, facendo sì che MySQL si comportasse "secondo lo standard SQL" (ibid).


Ho aggiornato da 5.6 a 5.7.11 e il problema è stato risolto per me (e la rimozione di STRICT_TRANS_TABLES non ha funzionato per me), quindi sto upvoting questo e downvoting il resto delle risposte
knocte

5
@knocte Non tutti possono aggiornare MySQL sul proprio sistema, quindi non vale la pena votare a favore di questo.
JulienD

L'unica risposta che mi aiuta davvero. La rimozione del NOT NULLvincolo o l'aggiunta del valore predefinito alla colonna ha risolto il problema. Il trigger funziona come previsto.
Ruslan Stelmachenko

3

In Windows Server modifica my.ini (ad esempio file di programma \ mysql \ mysql server nn \ my.ini)

Non vorrei semplicemente impostare sql-mode = "", piuttosto suggerisco di rimuovere STRICT_TRANS_TABLES dalla riga, lasciare tutto com'era e quindi riavviare MySQL dall'utilità dei servizi. Aggiungi un commento per i futuri programmatori chi sei e cosa hai fatto.


Questa risposta dice lo stesso. stackoverflow.com/a/52004654/10431118
karma4917

In generale sì, ma il punto è che sto dicendo specificamente di non cancellare tutti i valori di sql-mode, ma piuttosto di rimuovere solo STRICT_TRANS_TABLES, poiché è tutto ciò di cui hai bisogno. Altrimenti potresti influire su qualche altro servizio.
Bill Degnan

1

ho impostato i campi su non nulli e il problema è stato risolto, si aggiorna quando viene comandato di memorizzare un'informazione, non mostra più il messaggio msqli che il campo era vuoto perché non hai inserito valore, bene l'applicazione di questa soluzione può funzionare su alcuni progetti dipende dalla struttura del progetto.


Ha risolto il mio errore modificando l' defaultattributo della colonna da nonea NULL. A meno che non ci siano risposte di alto livello! il mio cPanel mi dava accesso negato all'hosting condiviso quando ho provato ad aggiornare la variabile sql_mode.
Rashid,

0

ho risolto il problema cambiando il file my.ini che si trova nella cartella dei dati. per mysql 5.6 il file my.ini è stato spostato nella cartella dei dati anziché nella cartella di installazione bin o mysql.


0

Penso che la colonna del nome abbia valori nulli in questo caso.

update try set name='abc' where created_by='def';
  
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.