如何在不指定列名的情况下使用 AUTO_INCREMENT 列向数据库插入新行?

Posted

技术标签:

【中文标题】如何在不指定列名的情况下使用 AUTO_INCREMENT 列向数据库插入新行?【英文标题】:How to insert new row to database with AUTO_INCREMENT column without specifying column names? 【发布时间】:2011-03-30 10:43:49 【问题描述】:

我有一个包含以下列的表格:

id - INT UNSIGNED AUTO_INCREMENT name - VARCHAR(20) group - VARCHAR(20)

我知道我可以像这样添加一行:

INSERT INTO table_name (name, group) VALUES ('my name', 'my group')

我想知道是否有一种方法可以添加一行不指定列名,比如没有 AUTO_INCREMENT 列时?

【问题讨论】:

【参考方案1】:

对于某些数据库,您只需将NULL 显式插入auto_increment 列即可:

INSERT INTO table_name VALUES (NULL, 'my name', 'my group')

【讨论】:

但是,这是一种非常糟糕的做法,不应该这样做。如果列以某种方式重新排列,则应始终使用列名执行插入语句,否则会将数据放入错误的列中。如果添加了另一列,则插入将失败。我不能足够强调这是多么糟糕的做法。由于一点点懒惰,您可能会破坏数据的完整性。老实说,由于您可以从对象浏览器中拖放列名,因此我们谈论的是冒着您的数据风险,因为您懒得在一项任务上多花一分钟时间。 如果你使用python,则通过None【参考方案2】:

更好的是,使用DEFAULT 而不是NULL。您要存储默认值,而不是可能触发默认值的 NULL。

但是你最好给所有的列命名,使用一条 SQL 就可以创建你需要的所有 INSERT、UPDATE 和 DELETE。只需检查information_schema 并构建您需要的查询。无需全部手动完成,SQL 可以帮助您。

【讨论】:

这对 Postgres 很有帮助。使用 NULL 会导致 ERROR: null value in column "id" violates not-null constraint【参考方案3】:

只需添加列名,是的,您可以使用 Null 代替,但在任何插入中都不使用列名是一个非常糟糕的主意。

【讨论】:

投反对票,因为这根本不能回答问题,而且对于非生产/非关键环境中的一次性查询,不使用列名就可以了。

以上是关于如何在不指定列名的情况下使用 AUTO_INCREMENT 列向数据库插入新行?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不指定列名的情况下从另一个表更新一个表?

BigQuery - 如何在不使用列名作为值的情况下导入 CSV?

如何在不使用 %s 的情况下安全、动态地在查询中设置列名?

在不指定所有列名的情况下应用所有列?

如何在不包含新列名和类型的情况下更改现有 Hive 表中的列注释?

如何在不使用集合运算符的情况下在 oracle 中查找不匹配的行并加入 & 还查询特定行的不匹配列名