【问题标题】:MYSQL: How to make NULL or empty data default to 0 during insertMYSQL:如何在插入期间使 NULL 或空数据默认为 0
【发布时间】:2013-03-26 17:16:24
【问题描述】:

所以这看起来很简单,我发誓我以前做过,但由于某种原因它对我不起作用。

我正在使用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;

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

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

我在这里遗漏了什么吗?我需要编写某种触发器吗?如果不需要的话,我不想在将脚本中的数据放入数据库之前对其进行清理。

【问题讨论】:

标签: mysql sql database phpmyadmin mamp


【解决方案1】:

您绝对可以为此使用触发器

假设您使该字段可以为空

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 |
+-----------+-----------+

【讨论】:

  • 我试了一下,但收到以下错误Error: SQLSTATE[HY000]: General error: 1436 Thread stack overrun: 15168 bytes used of a 131072 byte stack, and 128000 bytes needed. Use 'mysqld --thread_stack=#' to specify a bigger stack.
  • 将thread_stack参数的值增加到192(256)KB。请参阅此 SO 问题 stackoverflow.com/a/5264965/1920232 和 mysql 文档 dev.mysql.com/doc/refman/5.0/en/…
【解决方案2】:

如果您在插入中明确将值设置为 NULL,但希望 MySQL 将 NULL 替换为 0,一种方法是在 CREATE TABLE 语句中定义允许 NULL 的列,然后替换带有TRIGGER 的NULL。

类似这样的:

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自己尝试一下

【讨论】:

  • 请看我在彼得姆的回答下的评论。
【解决方案3】:

您忘记发布 INSERT 查询,但我确定问题就在那里。这按预期工作:

insert into listings (ListingID) values(1)

... 因为您省略了BathsFull,所以 MySQL 使用默认值。这不会:

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

...因为你告诉 MySQL 你想要 NULL.

【讨论】:

    【解决方案4】:

    也许你应该试试这个:

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

    【讨论】:

      【解决方案5】:

      插入时可以使用default关键字获取列的默认值。

      例子:

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

      【讨论】:

      • 我在我的插入脚本中使用 cakePHP,所以它不像改变我的插入语句那样简单。这就是我希望 MySQL 处理它的原因。
      • 我不熟悉它,所以我真的帮不上忙,也许你可以使用 Álvaro G. Vicario 的解决方案
      猜你喜欢
      • 2020-10-12
      • 1970-01-01
      • 2016-01-31
      • 2017-02-19
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 2011-07-20
      相关资源
      最近更新 更多