2010-08-02 15 views
35

Ich habe eine Tabelle in MySQL, die einige Spalten haben, die Standardwerte angegeben haben, aber wenn ich versuche, eine Zeile einzufügen (keine Werte für diese Standardspalten), wird ein Fehler ausgegeben, der besagt, dass ich keine NULL-Werte einfügen kann.MySQL - Kann NULL-Wert in Spalte nicht einfügen, aber ich habe einen Standardwert angegeben?

Hier ist das Tabellenbeispiel;

CREATE TABLE `users` (
    `Id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `UniqueName` varchar(120) NOT NULL, 
    `Password` varchar(1000) NOT NULL, 
    `PublicFlag` tinyint(1) NOT NULL, 
    `NoTimesLoggedIn` int(10) unsigned NOT NULL DEFAULT '0', 
    `DateTimeLastLogin` timestamp NOT NULL DEFAULT '1971-01-01 00:00:00', 
    `UserStatusTypeId` int(10) unsigned NOT NULL, 
    `Private` tinyint(1) NOT NULL DEFAULT '0', 
    `SiteName` varchar(255) NOT NULL, 
    `CountryId` int(10) NOT NULL DEFAULT '0', 
    `TimeZoneId` varchar(255) NOT NULL DEFAULT 'UTC', 
    `CultureInfoId` int(10) unsigned NOT NULL DEFAULT '0', 
    `DateCreated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `UserCreated` int(10) unsigned NOT NULL, 
    `LastUpdatedBy` int(10) unsigned NOT NULL, 
    `DateLastUpdated` datetime DEFAULT NULL, 
    PRIMARY KEY (`Id`), 
    UNIQUE KEY `UniqueName_UNIQUE` (`UniqueName`), 
    KEY `Index 3` (`SiteName`) 
) 

Es beschwert sich über TimeZoneID, und wenn ich TimeZoneID bevölkern, klagt es über CultureInforId.

Ich bin mit MySQL Version: 5.1.43-community

Hier wird die INSERT-Abfrage ich einfügen versuche, packte aus NHibernate Profiler:

INSERT INTO Users 
      (UniqueName, 
      Password, 
      PublicFlag, 
      NoTimesLoggedIn, 
      DateTimeLastLogin, 
      SiteName, 
      TimeZoneId, 
      DateCreated, 
      DateLastUpdated, 
      Private, 
      CountryId, 
      CultureInfoId, 
      UserCreated, 
      LastUpdatedBy, 
      UserStatusTypeId) 
VALUES  ('[email protected]','u1uhbQviLp89P9b3EnuN/Prvo3A4KVSiUa0=',1, 
0,'1/01/1971 12:00:00 AM','V9O1T80Q6D',NULL,'2/08/2010 2:13:44 AM', 
'2/08/2010 2:13:44 AM',0, NULL, NULL, 4, 4,31) 
+0

Ist es nur ich oder gibt es nur 12 Felder und doch versuchen Sie 15 Werte einzufügen? – Ross

Antwort

36

Verwenden Sie das DEFAULT Schlüsselwort statt:

INSERT INTO users (TimeZoneId) VALUES (DEFAULT); 
+0

+1: Ich erinnere mich, dass das vor kurzem kommt ... –

+0

Danke Bill, das funktioniert, aber wie für die Antwort, ich bin immer noch auf der Suche nach, warum es plötzlich erschien heute und nicht vorher. SO könnte es NHibernate oder MySQL nicht sicher sein. – Ryk

+2

Wenn sich das Verhalten geändert hat, müssen Sie etwas in Ihrer * Umgebung *, Ihrem * Code * oder Ihren * Daten * geändert haben. Ich kann nicht erraten, welcher. Sonst hat sich das Verhalten nicht geändert - es hat die ganze Zeit so funktioniert und du hast es nie bemerkt. Das passiert mir manchmal. –

6

Fügen Sie keine NULL-Werte ein. Ich gehe davon aus Sie diese Syntax versuchen:

INSERT INTO users VALUES (null, 'Jones', 'yarg', 1, null, null, null); 

Stattdessen verwenden Sie folgende Syntax:

INSERT INTO users SET UniqueName='Jones', Password='yarg'; 

Für mehr Informationen, die MySQL docs on INSERT sehen.

+0

Dies könnte es sein, ich untersuche jetzt, da dies vorher funktionierte und nur anfing, sich über NULL-Inserts zu beschweren. – Ryk

+0

Wenn Sie Nullen in eine mehrzeilige Einfügung einfügen, gibt MySQL eine Warnung aus, anstatt zu fehlschlagen. Vielleicht hat es vorher immer eine mehrzeilige Einlage gemacht oder so etwas Seltsames. –

4

Sie haben "NOT NULL" für Felder festgelegt, die Sie versuchen, NULL einzufügen.

z. CountryId, CultureInfoId, TimeZoneID

führen Sie die folgenden Schritte aus:

ALTER TABLE `users` MODIFY `CountryId` int(10) DEFAULT '0' NULL; 
ALTER TABLE `users` MODIFY `CultureInfoId` int(10) unsigned DEFAULT '0' NULL; 
ALTER TABLE `users` MODIFY `TimeZoneId` varchar(255) DEFAULT 'UTC' NULL; 

EDIT: Habe nicht erkennen, dass er den Standardwert statt NULL auf "null" einfügen wollte. Grundsätzlich wurde, wie bereits vorgeschlagen, das Schlüsselwort DEFAULT anstelle von NULL für die Werte verwendet.

ODER lassen Sie die NULL-Felder und Werte zusammen und mysql verwendet die definierten Standardwerte, z.

INSERT INTO Users 
     (UniqueName, 
     Password, 
     PublicFlag, 
     NoTimesLoggedIn, 
     DateTimeLastLogin, 
     SiteName, 
     DateCreated, 
     DateLastUpdated, 
     Private, 
     UserCreated, 
     LastUpdatedBy, 
     UserStatusTypeId) 
VALUES  ('[email protected]','u1uhbQviLp89P9b3EnuN/Prvo3A4KVSiUa0=',1, 
0,'1/01/1971 12:00:00 AM','V9O1T80Q6D','2/08/2010 2:13:44 AM', 
'2/08/2010 2:13:44 AM',0, 4, 4,31) 
+0

Ja, aber in dem Moment, in dem ich Nullen erlaube, fügen sie Nullen und nicht die Standardwerte ein. – Ryk

+0

Ah Entschuldigung sollte die q besser lesen: D. Das Schlüsselwort DEFAULT sollte dann verwendet werden ODER Sie lassen sie aus dem INSERT-Prozess insgesamt heraus. z. INSERT INTO 'users' (all_fields_except_nulls) VALUES (all_values_except_nulls) – User123342234

+0

Das ist, was die vorherigen 2 Antworten sagten. Vielen Dank, schätze die Hilfe. – Ryk

0

Als Alternative zur Verwendung des Schlüsselworts DEFAULT können Sie auch keine Werte für die Felder angeben, für die Sie Standardwerte haben möchten. Zum Beispiel, wenn Sie gerade entfernt TimeZoneID, CountryId und CultureInfoId aus der Abfrage ganz diese Spalten werden die Standardwerte automatisch erhalten:

INSERT INTO Users 
    (UniqueName, 
    Password, 
    PublicFlag, 
    NoTimesLoggedIn, 
    DateTimeLastLogin, 
    SiteName, 
    DateCreated, 
    DateLastUpdated, 
    Private, 
    UserCreated, 
    LastUpdatedBy, 
    UserStatusTypeId) 
VALUES 
    ('[email protected]','u1uhbQviLp89P9b3EnuN/Prvo3A4KVSiUa0=',1,0, 
    '1/01/1971 12:00:00 AM','V9O1T80Q6D','2/08/2010 2:13:44 AM', 
    '2/08/2010 2:13:44 AM',0,4,4,31) 

Ich bin mir nicht sicher, wie das im Zusammenhang mit der NHibernate aber als der Teil arbeiten würde Die Frage wurde nicht ganz so gut erklärt.

+0

Danke Rosco. Das wird ja funktionieren, aber es wurde bereits vorgeschlagen. – Ryk

+0

So war es, bemerkte nicht, dass die andere Antwort aktualisiert worden war =) – Ross

0

TimeZoneID varchar(255) NOT NULL DEFAULT 'UTC', CultureInfoId` int (10) unsigned NOT NULL DEFAULT '0',

Für diese Felder, die Sie gesetzt haben Einschränkungen als "nicht Null" und somit eingefügt Werte können nicht null sein und somit entweder die ändern Tabellenstruktur oder geben Sie einfach keine Werte für die Felder an, für die Sie Standardwerte haben möchten.

Verwandte Themen