12

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

我正在使用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'问题是,当将空数据传递给它时,我会收到一个 SQL 错误SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'BathsFull' cannot be null

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

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

4

5 回答 5

4

如果您在插入中明确将值设置为 NULL,但希望 MySQL 将 NULL 替换为 0,则一种方法是定义列以在CREATE TABLE语句中允许 NULL,然后将 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中亲自尝试一下

于 2013-04-04T15:09:41.433 回答
2

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

insert into listings (ListingID) values(1)

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

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

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

于 2013-04-04T15:01:12.130 回答
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 |
+-----------+-----------+
于 2013-04-04T15:10:12.027 回答
1

您可以使用default关键字在插入过程中获取列的默认值。

例子 :

INSERT INTO listings(ListingID, BathsFull) VALUES (2,DEFAULT);
于 2013-04-04T14:55:11.613 回答
1

也许你应该试试这个:

insert into listings (ListingID, ListingID, BathsFull) 
values (@listing_id, @ListingID, isnull(BathsFull, 0)
于 2013-04-04T14:55:29.923 回答