2013-04-04 87 views
8

因此,這看起來似乎是非常直接的,我發誓我之前做過這件事,但由於某種原因,它不適合我。MYSQL:如何在插入期間將NULL或空數據默認設置爲0

我使用的是MAMP,並有一個約200列的表,如果將NULL或空數據插入到其中,我想將它們中的大約20個默認爲0。

這裏是什麼我的表看起來像,以及我所爲,我想默認爲0。

於是就BathsFull注意到列做我有它設置爲NOT NULL DEFAULT '0'問題的一個小例子是當空數據傳遞給它時,我得到一個SQL錯誤SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'BathsFull' cannot be null

我也試着讓BathsFull accepts NULL and DEFAULT「0」,但是當空的數據傳遞,該表顯示NULL,而不是0

我在這裏錯過了什麼嗎?我是否需要編寫某種觸發器?如果不需要,我不希望在將腳本中的數據放入數據庫之前清理腳本中的數據。

+0

[MySQL的 - 不能在列中插入NULL值,但我有指定的默認值?]的可能重複(HTTP:// stackoverflow.com/questions/3384668/mysql-cannot-insert-null-value-in-column-but-i-have-a-default-value-specified) – 2013-04-04 15:47:02

回答

2

你絕對可以使用觸發器爲

假設你讓現場可空

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

觸發器

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

插入一些行

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); 

結果

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

我給了這個鏡頭,但得到以下錯誤:錯誤:SQLSTATE [HY000]:一般錯誤:1436線程堆棧溢出:使用131072字節堆棧的15168字節,需要128000字節。使用'mysqld --thread_stack =#'來指定一個更大的堆棧。' – bigmike7801 2013-04-04 16:12:57

+2

將thread_stack參數的值增加到192(256)KB。看到這個問題http://stackoverflow.com/a/5264965/1920232和mysql文檔http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_thread_stack – peterm 2013-04-04 16:26:34

1

可以使用default關鍵字在插入期間獲取列的默認值。

例子:

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

我使用cakePHP插入腳本,所以它不是隻需更改我的插入語句的外觀即可。這就是爲什麼我想讓MySQL處理它。 – bigmike7801 2013-04-04 15:01:00

+0

我不熟悉它,所以我不能真正幫助,也許你可以使用ÁlvaroG. Vicario的解決方案 – DessDess 2013-04-04 15:15:01

1

也許你應該試試這個:

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

你忘了張貼INSERT查詢,但我敢肯定,這個問題是存在的。因爲你忽略BathsFull所以MySQL使用defalt

insert into listings (ListingID) values(1) 

...:可正常工作。這不:

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

...因爲你告訴MySQL的,你NULL

3

如果將值明確設置爲NULL在您的插入,但想要MySQL的以0比替換NULL,要做到這一點的方法之一是將列定義爲允許在CREATE TABLE聲明NULL,然後更換空與TRIGGER

事情是這樣的:

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 ; 

你可以嘗試一下在這個SQL Fiddle

+0

請參閱Peterm的答案下的評論。 – bigmike7801 2013-04-04 16:16:36

相關問題