当在数据库中添加具有“ nullable”属性和默认值的新列时,如何在代码中保留相同的“ INSERT INTO”语句?

Vin*_*ent 0 mysql sql

让我们考虑一个包含两列的“用户” 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进行同样的操作?

Gor*_*off 6

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

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(以及其他任何列)为其默认值。