让我们考虑一个包含2列的“用户”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');在应用程序中添加用户的任何地方,我都有以下代码:
INSERT INTO `user` VALUES (NULL, <name to insert>);现在,如果我添加一个默认值为0的“is_admin”布尔值,如下所示:
ALTER TABLE `user` ADD COLUMN `is_admin` TINYINT NOT NULL DEFAULT 0;如果我使用VALUES (NULL, <name to insert>)运行插入查询,我希望MySQL理解我希望新用户将is_admin设置为0,但它不起作用:
Error Code: 1136. Column count doesn't match value count at row 1我认为这是因为“NULL”标志,所以我将'ADD列‘语句从’NULL‘改为' NULL’:
ALTER TABLE `user` ADD COLUMN `is_admin` TINYINT NULL DEFAULT 0;现在很明显,我希望它的行为。我说过默认值应该是0,我甚至没有将它设置为强制性的。但我还是会犯同样的错误。
我只需将所有出现的INSERT INTO用户更新为:
INSERT INTO `user` VALUES (NULL, <name to insert>, 0);或
INSERT INTO `user` VALUES (NULL, <name to insert>, default);在这个例子中,它看起来不是什么大事,但是在一个包含数十个INSERT语句的大型应用程序中,这是一个很重要的问题,因为在每个版本中,您必须修改所有修改过的表的所有insert语句,如果您错过了一个表,那么它就不再工作了。
我在Oracle工作了很多年,也许我错了,但我记得Oracle在没有提供时使用默认值。
有没有办法对MySQL做同样的事情?
发布于 2019-09-06 14:10:28
执行插入时始终列出列。所以:
INSERT INTO user (id, fullname)
VALUES (NULL, 'John Smith');这反过来又是过火了。只要做:
INSERT INTO user (fullname)
VALUES ('John Smith');这将将is_admin (和任何其他列)设置为其默认值。
https://stackoverflow.com/questions/57823641
复制相似问题