2013-04-04 5 views
8

Das scheint also ziemlich geradlinig zu sein und ich schwöre, ich habe das schon mal gemacht, aber aus irgendeinem Grund funktioniert es einfach nicht für mich.MYSQL: Wie man NULL oder leere Daten beim Einfügen auf 0 setzt

Ich verwende MAMP und habe eine Tabelle mit etwa 200 Spalten und ich möchte etwa 20 von ihnen standardmäßig auf 0, wenn NULL oder leere Daten eingefügt werden.

Hier ist ein kleines Beispiel dafür, was meinen Tisch und sieht aus wie wie das, was ich für Spalten getan haben, die ich

So bemerken auf BathsFull ich es NOT NULL DEFAULT '0' setzen das Problem auf 0 auf Standard wollen Wenn leere Daten an ihn übergeben werden, erhalte ich einen SQL-Fehler von SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'BathsFull' cannot be null.

habe versucht, ich auch so, dass BathsFull accepts NULL and DEFAULT ‚0‘, aber wenn sie leer Daten übergeben wird, von 0 die Tabelle zeigt NULL statt.

Fehle ich hier etwas? Muss ich eine Art Trigger schreiben? Ich möchte nicht die Daten in meinem Skript scrubben, bevor ich es in die DB setze, wenn ich nicht muss.

+0

möglich Duplikat [MySQL - Kann nicht NULL-Wert in Spalte einfügen, aber ich habe einen Standardwert angegeben?] (Http: // stackoverflow.com/questions/3384668/mysql-cannot-insert-null-value-in-column-but-i-have-a-default-value-specified) –

Antwort

2

können Sie auf jeden Fall einen Trigger verwenden für diese

Unter der Annahme, dass Sie das Feld auf NULL festlegbare machen

CREATE TABLE `listings` (
    `ListingID` int(11) NOT NULL, 
    `BathsFull` int(6),    <----- 
    PRIMARY KEY (`ListingID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Auslöser

DELIMITER $$ 
CREATE TRIGGER tg_lst_insert BEFORE INSERT ON listings 
FOR EACH ROW 
BEGIN 
    SET NEW.BathsFull = IFNULL(NEW.BathsFull, 0); 
END $$ 
DELIMITER ; 

Einfügen einiger Zeilen

INSERT INTO `listings` VALUES(1, ''); 
INSERT INTO `listings` VALUES(3, 'a'); 
INSERT INTO `listings` VALUES(4, NULL); 
INSERT INTO `listings` (ListingID) VALUES(2); 
INSERT INTO `listings` VALUES(5, 3); 

Ergebnis

+-----------+-----------+ 
| ListingID | BathsFull | 
+-----------+-----------+ 
|   1 |   0 | 
|   2 |   0 | 
|   3 |   0 | 
|   4 |   0 | 
|   5 |   3 | 
+-----------+-----------+ 
+0

Ich gab dies eine Aufnahme, aber bekomme den folgenden Fehler 'Fehler: SQLSTATE [HY000]: Allgemeiner Fehler: 1436 Thread Stack überschritten: 15168 Bytes eines 131072 Byte-Stack verwendet und 128000 Bytes benötigt. Verwenden Sie 'mysqld - thread_stack = #', um einen größeren Stack anzugeben. ' – bigmike7801

+2

Erhöhen Sie den Wert des Parameters thread_stack auf 192 (256) KB. Sehen Sie sich diese SO-Frage http://stackoverflow.com/a/5264965/1920232 und mysql doc http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_thread_stack an – peterm

1

Sie können das Schlüsselwort default verwenden, um beim Einfügen den Standardwert der Spalte zu erhalten.

Beispiel:

INSERT INTO listings(ListingID, BathsFull) VALUES (2,DEFAULT); 
+0

Ich benutze CakePHP für meine einfügen Skripte, so ist es nicht als einfach wie nur ändern, wie meine Insert-Anweisung aussieht. Deshalb möchte ich, dass MySQL damit umgeht. – bigmike7801

+0

Ich bin nicht damit vertraut, so kann ich nicht wirklich helfen, vielleicht können Sie Álvaro G. Vicario's Lösung – DessDess

1

Vielleicht sollten Sie dies versuchen:

insert into listings (ListingID, ListingID, BathsFull) 
values (@listing_id, @ListingID, isnull(BathsFull, 0) 
1

Sie haben vergessen, die INSERT-Abfragen zu schreiben, aber ich bin sicher, dass das Problem besteht. Dies funktioniert wie erwartet:

insert into listings (ListingID) values(1) 

... weil Sie weglassen BathsFull so MySQL die defalt verwendet. Dies gilt nicht:

insert into listings (ListingID, BathsFull) values(1, null); 

... weil Ihre MySQL sagen, dass SieNULL wollen .

3

Wenn Sie den Wert in Ihrer Einfügung explizit auf NULL setzen, aber möchten, dass MySQL NULL durch 0 ersetzt, können Sie zum Beispiel die Spalte NULL in der CREATE TABLE -Anweisung zulassen und dann NULL ersetzen mit einem TRIGGER.

Etwas wie folgt aus:

CREATE TABLE `listings` (
    `ListingID` int(11) NOT NULL, 
    `BathsFull` int(6) NULL DEFAULT 0, 
    PRIMARY KEY (`ListingID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

delimiter $$ 

create trigger tr_b_ins_listings before insert on listings for each row 
begin 
    set new.BathsFull = coalesce(new.BathsFull,0); 
end $$ 

delimiter ; 

Probieren Sie es für sich selbst in diesem SQL Fiddle

+0

verwenden Bitte beachten Sie den Kommentar, den ich unter Peterm's Antwort gestellt habe. – bigmike7801