MYSQL: как сделать NULL или пустые данные по умолчанию 0 во время вставки

похоже, это будет довольно прямолинейно, и я клянусь, что делал это раньше, но по какой-то причине это просто не работает для меня.

Я использую MAMP и есть таблица с примерно 200 столбцами, и я хочу, чтобы около 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 acceptsNULLandпо умолчанию "0", однако, когда пустые данные передаются, таблица показывает NULL вместо 0.

Я что-то пропустил? Мне нужно написать что-то вроде триггера? Я не хочу очищать данные в моем скрипте, прежде чем помещать его в БД, если мне не нужно.

5 ответов


вы можете определенно использовать триггер для этого

предполагая, что вы делаете поле nullable

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

Если вы явно устанавливаете значение 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 ;

попробуйте сами в этом SQL Fiddle


можно использовать default ключевое слово, чтобы получить значение по умолчанию для данного столбца во время вставки.

пример :

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

может быть, вы должны попробовать это:

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

вы забыли опубликовать запросы вставки, но я уверен, что проблема есть. Это работает так, как ожидалось:

insert into listings (ListingID) values(1)

... потому что ты опускаешь BathsFull таким образом, MySQL использует defalt. Это не значит:

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

... потому что вы говорите MySQL, что вы хочу NULL.