让我们考虑一个包含两列的“用户” MySQL表:
CREATE TABLE `user` ( `id` INT NOT NULL AUTO_INCREMENT, `fullname` TEXT NOT NULL, PRIMARY KEY (`id`));
INSERT INTO `user` VALUES (NULL, 'John Smith');
INSERT INTO `user` VALUES (NULL, 'James Miller');
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中随处添加用户的地方,都有以下代码:
INSERT INTO `user` VALUES (NULL, <name to insert>);
Run Code Online (Sandbox Code Playgroud)
现在,如果我添加一个默认值为0的'is_admin'布尔值,如下所示:
ALTER TABLE `user` ADD COLUMN `is_admin` TINYINT NOT NULL DEFAULT 0;
Run Code Online (Sandbox Code Playgroud)
如果我使用运行查询VALUES (NULL, <name to insert>),我希望MySQL能够理解我希望新用户将is_admin设置为0,但这是行不通的:
Error Code: 1136. Column count doesn't match value count at row 1
Run Code Online (Sandbox Code Playgroud)
我以为是因为“ NOT NULL”标志,所以我将“ ADD COLUMN”语句从“ NOT NULL”更改为“ NULL”:
ALTER TABLE `user` ADD COLUMN `is_admin` TINYINT NULL DEFAULT 0;
Run Code Online (Sandbox Code Playgroud)
现在很明显我希望它如何表现。我说默认值应为0,甚至没有将其设置为强制性。但是我仍然遇到同样的错误。
我只需要将所有INSERT INTO用户事件更新为:
INSERT INTO `user` VALUES (NULL, <name to insert>, 0);
Run Code Online (Sandbox Code Playgroud)
要么
INSERT INTO `user` VALUES (NULL, <name to insert>, default);
Run Code Online (Sandbox Code Playgroud)
在此示例中,这似乎没什么大不了,但是在具有数十条INSERT语句的大型应用程序上,这很重要,因为在每个版本中,您必须为所有已更改的表修改所有insert语句,并且如果错过了一个表,那么它将不再起作用。
我在Oracle工作了很多年,也许我错了,但我想我记得没有提供Oracle时使用的是默认值。
有什么办法可以对MySQL进行同样的操作?
插入时始终列出列。所以:
INSERT INTO user (id, fullname)
VALUES (NULL, 'John Smith');
Run Code Online (Sandbox Code Playgroud)
反过来,这是过分的杀伤力。做就是了:
INSERT INTO user (fullname)
VALUES ('John Smith');
Run Code Online (Sandbox Code Playgroud)
这将设置is_admin(以及其他任何列)为其默认值。
| 归档时间: |
|
| 查看次数: |
44 次 |
| 最近记录: |