MYSQL:如何在插入期间使NULL或空数据默认为0

big*_*801 9 mysql sql database mamp phpmyadmin

所以这看起来很简单,我发誓我以前做过这个,但由于某种原因它只是不适合我.

我正在使用MAMP并拥有一个包含大约200列的表,如果将NULL或空数据插入其中,我希望其中大约20个默认为0.

这是我的表格的一个小例子,以及我为默认为0的列所做的事情.

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

所以请注意BathsFull我设置NOT NULL DEFAULT '0'的问题是,当空数据传递给它时,我得到一个SQL错误SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'BathsFull' cannot be null.

我也试过BathsFull acceptsNULL andDEFAULT'0',但是当传递空数据时,表显示NULL而不是0.

我在这里错过了什么吗?我需要写一些触发器吗?如果我不需要,我不想在将其放入数据库之前擦除脚本中的数据.

Ike*_*ker 5

如果您在插入中显式地将值设置为 NULL,但希望 MySQL 将 NULL 替换为 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 ;
Run Code Online (Sandbox Code Playgroud)

在这个SQL Fiddle中亲自尝试一下


pet*_*erm 2

你绝对可以使用触发器

假设您使该字段可为空

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

扳机

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

插入一些行

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);
Run Code Online (Sandbox Code Playgroud)

结果

+-----------+-----------+
| ListingID | BathsFull |
+-----------+-----------+
|         1 |         0 |
|         2 |         0 |
|         3 |         0 |
|         4 |         0 |
|         5 |         3 |
+-----------+-----------+
Run Code Online (Sandbox Code Playgroud)

  • 将 thread_stack 参数的值增加到 192(256)KB。请参阅这个SO问题http://stackoverflow.com/a/5264965/1920232和mysql文档http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_thread_stack (3认同)