MySQL-Fehler 1364 Feld hat keine Standardwerte


112

Mein Tisch sieht aus wie

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

und dann habe ich einen Auslöser, um das Feld CREATED_BY automatisch zu füllen

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

Wenn ich eine Einfügung mit mache

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

Der Eintrag erfolgt in der Tabelle, aber ich erhalte immer noch die Fehlermeldung

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

Gibt es eine Möglichkeit, diesen Fehler zu unterdrücken, ohne das Feld auf Null zu setzen UND ohne den Trigger zu entfernen? Andernfalls werden in meinem Ruhezustand diese Ausnahmen angezeigt (obwohl die Einfügungen vorgenommen wurden), und die Anwendung stürzt ab.

Antworten:


28

Legen Sie einen Standardwert für Created_By(z. B. leer) festVARCHAR ) festlegen, aktualisiert der Trigger den Wert trotzdem.

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

Wie setze ich einen Standardwert in einem Java-Programm?
Nagarajan Shanmuganathan

1
Sie benötigen einen Standardwert in der Definition der Tabelle (Tabelle erstellen try (Name varchar (8), CREATED_BY varchar (40) DEFAULT '' not null))
KinSlayerUY

Dies behebt das Grundproblem nicht. Siehe die viel ausführlichere Antwort von Phyxx unten.
CSvan

3
Die Antwort von @csvan Phyxx behebt auch nicht die Grundursache, da die Grundursache ein Fehler in MySQL war, der in Version 5.7.1 behoben wurde. Siehe die Antwort von B98: stackoverflow.com/a/29854279/5389997 Durch das Entfernen des SQL-Modus strict_trans_table wird MySQL mehr anfällig für Datenqualitätsfehler, daher ist das Entfernen kein wirklich guter Rat.
Schatten

204

Dies wird durch den STRICT_TRANS_TABLESin der

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

Datei. Durch Entfernen dieser Einstellung und Neustarten von MySQL sollte das Problem behoben werden.

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

Wenn das Problem durch Bearbeiten dieser Datei nicht behoben werden kann, finden Sie unter http://dev.mysql.com/doc/refman/5.6/en/option-files.html weitere mögliche Speicherorte für Konfigurationsdateien.


5
Sie können eine SQL-Abfrage in Ihrem Datenbankverwaltungstool -- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
ausführen

5
aber vielleicht möchten Sie STRICT_TRANS_TABLES?
Andrew

In meinem Fall ist das Feld vom Typ DATETIME, wobei die Standardeinstellung NULL ist, und ich sehe immer noch den gleichen Fehler. Ich habe zwei Schemas in derselben Datenbank. eine für die Inszenierung, eine für die Produktion mit den gleichen Tabellenstrukturen. Es funktioniert in einem Schema, aber nicht in einem anderen mit genau derselben Tabellenstruktur in beiden. Ich bin verblüfft. Ich bin nicht sicher, ob es ein Problem mit STRICT_TRANS_TABLES ist
dresh

1
Ich habe STRICT_TRANS_TABLES aus /etc/my.cnf entfernt - in der Zeile, die mit sql_mode beginnt - und den MySQL-Dienst neu gestartet, und das Problem ist behoben.
Mike Volmar

92

Öffnen Sie phpmyadmin und gehen Sie zur Registerkarte "Mehr" und wählen Sie das Untermenü "Variablen". Scrollen Sie nach unten, um den SQL-Modus zu finden. Bearbeiten Sie den SQL-Modus und entfernen Sie 'STRICT_TRANS_TABLES'. Speichern Sie ihn.


22
Diese Frage bezieht sich auf MySQL und erwähnt phpmyadmin nicht. Bitte nehmen Sie nicht an, dass jeder das läuft.
Chris

2
@ jackadams49 Diese Änderung bleibt nicht erhalten. Können Sie mir mitteilen, was Sie getan haben, damit diese Änderung einen Systemneustart überlebt?
LD James

8
@ jackadams49, damit es bleibt, sudo nano /etc/mysql/my.cnfhinzufügen [mysqld] sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION", speichern und sudo service mysql restart
beenden

1
Zum Hinzufügen musste ich die Werte von sql_modeauf null ändern , dh sql_mode = ""für andere ähnliche Fehler.
maan81

Wir haben kürzlich unser MySQL auf 5.7 aktualisiert. Wir hatten zu viele Probleme. Das hat bei mir funktioniert. Hat meinen Tag gerettet.
Schüler

38

Führen Sie in phpmyadmin Folgendes aus:

select @@GLOBAL.sql_mode

In meinem Fall bekomme ich folgendes:

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

Kopieren Sie dieses Ergebnis und entfernen Sie es STRICT_TRANS_TABLES. Führen Sie dann Folgendes aus:

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'

ya aber dafür musst du dich bei phpmyadmin mit root account anmelden :) super account
user889030

1
Nach vier Stunden funktionierte diese Lösung für mich in Ubuntu 16.04. Toll !
Waleed Ahmed

3
Sie brauchen phpmyadmindiese Befehle überhaupt nicht , verwenden Sie sie in der mysqlBefehlszeile.
Gustyaquino

4
Dies wird nach dem Neustart von mysql / server / pc auf die Standardeinstellungen zurückgesetzt. Sie müssen bearbeiten /etc/mysql/mysql.conf.d/mysqld.cnf und nach [mysqld] fügen Sie diese Zeile: 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

Lösung von @ waza123, diese funktioniert für mich nach dem Upgrade auf MySQL 5.7.20. danke
fredy kardian

28

Als ich das gleiche Problem mit mysql5.6.20 hatte, das mit Homebrew installiert wurde, löste ich es, indem ich in my.cnf ging

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

Finden Sie die Linie, die so aussieht:

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

Kommentar oben Zeile aus und starten Sie MySQL-Server neu

mysql.server restart

Fehler weg!


15

Führen Sie die MySQL-Konsole aus:

mysql -u your_username -p

, Datenbank auswählen:

USE your_database;

und ausführen (auch von der MySQL-Konsole):

SET GLOBAL sql_mode='';

Dadurch wird der strikte Modus deaktiviert und MySQL wird sich nicht mehr beschweren.

Um die Dinge klarer zu machen: In Ihrer Datenbankdefinition heißt es "Für dieses Feld muss der Standardwert definiert sein", und wenn Sie die Schritte von oben ausführen, sagen Sie zu MySql "Nein, ignorieren Sie es einfach". Wenn Sie also nur eine schnelle lokale Lösung durchführen möchten, ist diese Lösung in Ordnung. Im Allgemeinen sollten Sie jedoch in Ihrer Datenbankdefinition nachsehen, ob das Feld wirklich einen Standardwert benötigt, und ihn gegebenenfalls festlegen. Und wenn der Standardwert nicht benötigt wird, sollte diese Anforderung entfernt werden, um eine saubere Situation zu haben.


Ja, fügen Sie keine Standardeinstellung hinzu, entfernen Sie einfach die Regeln. Eine großartige Lösung (Sarkasmus impliziert). Tun Sie dies niemals als großartiges schlechtes Beispiel. Es löst das Problem jedoch
zardilior

1
Ja, stimme dir zu. Aber irgendwann haben Sie das People-Projekt eines anderen, das gut läuft, dh in der Produktion (wo der strikte Modus nicht eingestellt ist), und Sie möchten nur eine kleine Funktion oder einen Bugfix hinzufügen, der lokal funktioniert. Du willst nicht gegen die Drachen kämpfen, nur damit das Ding funktioniert. :)
MilanG

für dieses Szenario stimme ich zu
zardilior

@ zardilior was ist das Problem? Der Standardwert wird basierend auf dem Spaltentyp ausgewählt, wenn die Regel entfernt wird. Ich sehe nichts Falsches daran: / Diese Regel ist ohne Grund ziemlich hart.
Reloecc

1
Überhaupt nicht hart, es zwingt Sie nur dazu, einen Standard zu deklarieren oder einen Wert anzugeben. Auch der strikte Modus funktioniert für weit mehr Dinge als nur das. Daher ist es wirklich schrecklich, ihn zu deaktivieren, anstatt einen Deault in der Spalte zu deklarieren oder den Wert zu übergeben mor ein prod. Sie deaktivieren dort eine der guten
MySQL-

13

Wie andere sagten, wird dies durch den STRICT_TRANS_TABLESSQL-Modus verursacht.

So überprüfen Sie, ob der STRICT_TRANS_TABLESModus aktiviert ist:

SHOW VARIABLES LIKE 'sql_mode';

So deaktivieren Sie den strengen Modus:

SET GLOBAL sql_mode='';

Manuelles Entfernen von "STRICT_TRANS_TABLES" aus Variablen> sql_mode zum Testen und es hat funktioniert!
Prem Popatia

1
Du hast meinen Tag gerettet.
Umarbilal

Für mich macht es nichts, nachdem ich den zweiten Befehl ausgeführt und sql_mode (1. Befehl) überprüft habe. Auch nach dem Neustart des MySQL-Dienstes. Debian 9
Trainoasis

12

Vor jeder Einfüge-Aktion habe ich die folgende Zeile hinzugefügt und mein Problem gelöst.

SET SQL_MODE = '';

Ich bin mir nicht sicher, ob dies die beste Lösung ist.

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

1
Es ist nicht erforderlich, dies vor jeder Einfügeaktion zu tun. Führen Sie dies einfach einmal zu Beginn Ihres Skripts aus, unmittelbar nachdem Sie eine Verbindung zur Datenbank hergestellt haben. Jede Einfüge-Abfrage funktioniert ohne den Fehler "Feld hat keinen Standardwert".
José Carlos PHP

Diese Lösung ist in Ordnung, da Sie keine Tabellen ändern müssen (möglicherweise müssen viele Felder geändert werden).
José Carlos PHP

11

Seine Arbeit und getestete Kopie in Konfigurationsdatei: /etc/mysql/my.cnf ODER /bin/mysql/my.ini

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

Starten Sie dann MySQL neu


9

Ändern Sie Ihre Abfrage und fügen Sie "IGNORE" hinzu als:

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

Das hat bei mir funktioniert - mein PHP-Skript würde abgebrochen, aber mit IGNORE wird nur eine neue Zeile angezeigt! Wie "sicher" ist es nun, IGNORE in PHP-MYSQL-Abfragen fest codiert zu haben? Ich benutze dies, um automatisch Zeilen für einen neuen "Tag" hinzuzufügen, an dem es vorher nicht existierte
Levchik

@Levchik Wenn Sie IGNORE verwenden, gibt MySQL anstelle eines Fehlers stattdessen eine Warnung aus, wenn ein Fehler auftritt
Stefan

6

Für Windows WampServer- Benutzer:

WAMP> MySQL> my.ini

Datei suchen nach sql-mode=""

Kommentieren Sie es aus.


2
In meiner Version musste ich ändern: 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"zu sql-mode="". Das Auskommentieren sql-mode=""verursachte den Fehler.
Julian

5

Dies scheint auf einen langjährigen (seit 2004) Fehler (# 6295) in MySQL mit dem Titel zurückzuführen zu sein

Trigger werden für NOT NULL-Spalten nicht verarbeitet .

Es wurde angeblich in Version 5.7.1 von MySQL (Changelog, letzter Eintrag) im Jahr 2013 behoben , wodurch sich MySQL wie „gemäß dem SQL-Standard“ verhält (ebenda).


Ich habe ein Upgrade von 5.6 bis 5.7.11 und das Problem war für mich festgelegt (und die Entfernung von STRICT_TRANS_TABLES nicht für mich Arbeit), so bin ich upvoting dies und Downvoting den Rest der Antworten
knocte

5
@knocte Nicht jeder kann MySQL auf seinem System aktualisieren, daher lohnt es sich nicht, dafür zu stimmen.
JulienD

Die einzige Antwort, die mir wirklich hilft. Das Entfernen der NOT NULLEinschränkung oder das Hinzufügen eines Standardwerts zur Spalte hat das Problem behoben. Der Trigger funktioniert wie erwartet.
Ruslan Stelmachenko

3

Bearbeiten Sie in Windows Server my.ini (z. B. Programmdateien \ mysql \ mysql server nn \ my.ini).

Ich würde nicht einfach den sql-mode = "" setzen, sondern ich schlage vor, STRICT_TRANS_TABLES aus der Zeile zu entfernen, alles so zu lassen, wie es war, und dann MySQL über das Dienstprogramm services neu zu starten. Fügen Sie einen Kommentar für zukünftige Programmierer hinzu, wer Sie sind und was Sie getan haben.


Diese Antwort sagt dasselbe. stackoverflow.com/a/52004654/10431118
karma4917

Im Allgemeinen ja, aber mein Punkt ist, dass ich ausdrücklich sage, nicht alle Werte des SQL-Modus auszublenden, sondern nur STRICT_TRANS_TABLES zu entfernen, da dies alles ist, was Sie brauchen. Andernfalls könnten Sie einen anderen Dienst beeinträchtigen.
Bill Degnan

1

Ich setze die Felder auf nicht null und das Problem wurde behoben. Es wird aktualisiert, wenn befohlen wird, Informationen darin zu speichern. Es wird keine msqli-Meldung mehr angezeigt, dass das Feld leer war, weil Sie keinen Wert in das Feld eingefügt haben. Die Anwendung dieser Lösung kann bei einigen funktionieren Projekte hängen von Ihrer Projektstruktur ab.


Es hat meinen Fehler behoben, indem das defaultAttribut der Spalte von nonebis geändert wurde NULL. Es sei denn, es gibt Antworten mit hoher Bewertung! Mein cPanel hat mir den Zugriff auf Shared Hosting verweigert, als ich versuchte, die Variable sql_mode zu aktualisieren.
Rashid

0

Ich habe das Problem beim Ändern der Datei my.ini im Datenordner gelöst. Für MySQL 5.6 wurde die Datei my.ini in den Datenordner verschoben, nicht in den Installationsordner bin oder mysql.


0

Ich denke in der Namensspalte haben in diesem Fall Nullwerte.

update try set name='abc' where created_by='def';
  
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.