【问题标题】:Insert with 2 DEFAULT constraints in a row在一行中插入 2 个 DEFAULT 约束
【发布时间】:2018-02-28 21:42:20
【问题描述】:

假设我有一个这样的创建表脚本:

CREATE TABLE Person (
    id INT PRIMARY KEY,
    age INT DEFAULT 18,
    iq INT DEFAULT 100
);

所以我连续有两个 DEFAULT 约束。现在我进行这样的插入:

INSERT INTO Person VALUES(1,85);

我们如何知道我们是跳过属性age 还是属性iq?

感谢您的帮助。

【问题讨论】:

  • 您应该编辑您的问题并在标签中指定哪种类型的 SQL。
  • 这是故意的,我想宽泛一些。
  • 投票结束,因为过于广泛。有太多类型的 RDMS 需要回答才能被认为是完整的。
  • 但似乎 rollstuhlfahrer 的回答完美地做到了这一点。我们不必进入最晦涩的 RDMS,只需了解主要的。
  • 这是一个默认的值,而不是“约束”——INSERT 语句实际上是无效的标准 SQL。

标签: sql


【解决方案1】:

您的问题的答案:视情况而定。 ;-)

MySQL

在 MySQL 上运行查询会得到以下错误:

Error: ER_WRONG_VALUE_COUNT_ON_ROW: Column count doesn't match value count at row 1

对于 MySQL,您需要告诉 DBMS 您想要拥有哪些列(以及 DB 应该使用默认数据填充哪些列)。像这样:

INSERT INTO Person(id, age) VALUES(1,85);

或者你需要告诉数据库在哪里使用默认值。您可以为这些列传递关键字DEFAULT:

INSERT INTO Person VALUES(1,85, DEFAULT);

见:MySQL INSERT Syntax

SQLite

SQLite 的行为类似于 MySQL,这里的错误信息是:

SQLITE_ERROR: table Person has 3 columns but 2 values were supplied

这意味着,您必须指定列。

PostgreSQL

在 PostgreSQL 表上运行查询将产生

id  age iq
1   85  100

这里 PostgreSQL 将按照定义的顺序使用表定义中的列,并用默认值填充所有剩余的列。

MS SQL 服务器

见:How to insert default values in SQL table?

【讨论】:

  • 感谢您的快速回答。更具体地说,对于 MySQL,是否有比重写所有列更快的方法,例如我们将在 INSERT 中放入的 DEFAULT 子句?
  • 是的,有。编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多