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 accepts
NULLand
по умолчанию "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
.