首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在我的数据库中添加具有“可空”属性和默认值的新列时,如何保持代码中相同的“插入”语句?

问在我的数据库中添加具有“可空”属性和默认值的新列时,如何保持代码中相同的“插入”语句?
EN

Stack Overflow用户
提问于 2019-09-06 14:08:30
回答 1查看 45关注 0票数 0

让我们考虑一个包含2列的“用户”MySQL表:

  • 自动增量id
  • 全名
代码语言:javascript
复制
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');

在应用程序中添加用户的任何地方,我都有以下代码:

代码语言:javascript
复制
INSERT INTO `user` VALUES (NULL, <name to insert>);

现在,如果我添加一个默认值为0的“is_admin”布尔值,如下所示:

代码语言:javascript
复制
ALTER TABLE `user` ADD COLUMN `is_admin` TINYINT NOT NULL DEFAULT 0;

如果我使用VALUES (NULL, <name to insert>)运行插入查询,我希望MySQL理解我希望新用户将is_admin设置为0,但它不起作用:

代码语言:javascript
复制
Error Code: 1136. Column count doesn't match value count at row 1

我认为这是因为“NULL”标志,所以我将'ADD列‘语句从’NULL‘改为' NULL’:

代码语言:javascript
复制
ALTER TABLE `user` ADD COLUMN `is_admin` TINYINT NULL DEFAULT 0;

现在很明显,我希望它的行为。我说过默认值应该是0,我甚至没有将它设置为强制性的。但我还是会犯同样的错误。

我只需将所有出现的INSERT INTO用户更新为:

代码语言:javascript
复制
INSERT INTO `user` VALUES (NULL, <name to insert>, 0);

或

代码语言:javascript
复制
INSERT INTO `user` VALUES (NULL, <name to insert>, default);

在这个例子中,它看起来不是什么大事,但是在一个包含数十个INSERT语句的大型应用程序中,这是一个很重要的问题,因为在每个版本中,您必须修改所有修改过的表的所有insert语句,如果您错过了一个表,那么它就不再工作了。

我在Oracle工作了很多年,也许我错了,但我记得Oracle在没有提供时使用默认值。

有没有办法对MySQL做同样的事情?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-06 14:10:28

执行插入时始终列出列。所以:

代码语言:javascript
复制
INSERT INTO user (id, fullname)
    VALUES (NULL, 'John Smith');

这反过来又是过火了。只要做:

代码语言:javascript
复制
INSERT INTO user (fullname)
    VALUES ('John Smith');

这将将is_admin (和任何其他列)设置为其默认值。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57823641

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档