2016-10-20 1 views
0

Ich habe ein Projekt, das Einfügungen machen, die keine Werte einfügen (nicht leere Werte) an den Säulen mit NOT NULL und NO STANDARD Werte. Ich glaubte, dass das Einfügen mit fehlenden erforderlichen Werten unmöglich ist, und es gibt immer einen Fehler aus: Feld 'xxxx' hat keinen Standardwert. Aber wie ich here mysql sehen Allgemeiner Fehler: 1364 Feld ‚xxxx‘ hat keinen Standardwert

sql-mode="NO_ENGINE_SUBSTITUTION" 

Ich bin verwirrt zu

eingestellt werden, weil ich denke, dass es gefährlich ist. Und wenn ich es abstelle, wird es für alle Projekte gelten und es könnte wirklich schlecht sein. Also was soll ich tun? Ist es möglich, den Modus nur für eine MySQL-Datenbank einzurichten, während sich andere Datenbanken im STRICT-Modus befinden? Was denkst du darüber? Ist es ein Problem oder nicht?

Antwort

1

Die Systemvariable sql-mode ist sowohl auf globaler als auch auf Sitzungsebene verfügbar. Dies bedeutet, dass Sie entweder den gesamten Server oder eine bestimmte Verbindung festlegen müssen. Daher gibt es keine Möglichkeit, dies für eine Teilmenge von DBs auf Serverebene zu konfigurieren. Sie können jedoch den SQL-Modus angeben, wenn Sie die Verbindung herstellen. Diese Verbindungen werden also im strikten Modus ausgeführt.

+0

die Details entnehmen sie bitte bei https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html – Aruna

+0

Ich hoffe es ist auch möglich Möglichkeit, die Sitzung auf NO_ENGINE_SUBSTITUTION zu setzen. Wie wird es in PHP aussehen? –

+0

Ich bin kein PHP-Experte. Wenn am Connector keine Option vorhanden ist, müssen Sie möglicherweise "SET SESSION sql_mode = ''" ausführen, bevor Sie andere Abfragen ausführen. Ich nehme an, dass Sie mehrere Abfragen mit derselben Verbindung ausführen können. Hoffentlich schaffen Sie die Verbindungen nicht überall. – Aruna

0

Die Lösung, die ich so ein Trigger gemacht vorschlagen wird, wenn es einen nicht Wert ist, wird es

dies ist ein Beispiel einen Nullwert dieser Spalte einzufügen:

CREATE TRIGGER upd_check BEFORE UPDATE ON account 
    FOR EACH ROW 
    BEGIN 
     IF NEW.amount < 0 THEN 
      SET NEW.amount = 0; 
     END IF; 
END; 
+0

Projekt ist fast fertig, so ist es unmöglich, Trigger für alle Tabellen zu machen. .. –

0

Also, wenn jemand will zu wissen, wie es in PHP/PDO für eine konkrete Sitzung aussieht:

$pdo = new PDO(
    $dsn, 
    $username, 
    $password, 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET sql_mode="NO_ENGINE_SUBSTITUTION"') 
); 
Verwandte Themen