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.
我在这里错过了什么吗?我需要写一些触发器吗?如果我不需要,我不想在将其放入数据库之前擦除脚本中的数据.
如果您在插入中显式地将值设置为 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中亲自尝试一下
你绝对可以使用触发器
假设您使该字段可为空
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)
| 归档时间: |
|
| 查看次数: |
19550 次 |
| 最近记录: |