【问题标题】:Insert statement asked me to insert for autoincrement column插入语句要求我插入自动增量列
【发布时间】:2013-03-06 01:59:13
【问题描述】:

我使用的是 PostgreSQL,我创建了下表:

CREATE TABLE "Task"
(
  "taskID" serial NOT NULL,
  "taskType" text NOT NULL,
  "taskComment" text NOT NULL,
  "taskDate" date NOT NULL,
  CONSTRAINT "Task_pkey" PRIMARY KEY ("taskID")
)

我将 taskID 设置为 serial 数据类型以自动递增。现在我很困惑如何使用INSERT 语句,因为表中的第一列应该自动递增,但INSERT 语句要求我自己插入一个值!有什么想法吗?

这是我的插入语句:

INSERT INTO "Task" VALUES ('HomeWork', 'No Comment', '3/3/2013');

【问题讨论】:

  • 请给我们看一下插入语句
  • 程序员如何在没有显示INSERT语句的情况下提出这个问题?
  • @ErwinBrandstetter 已添加。
  • 现在这是一个好问题。虽然在这种情况下几乎不相关,但应该始终包含 PostgreSQL version

标签: sql postgresql auto-increment


【解决方案1】:

您应该INSERT 语句中列出这个自动递增的列,它会按您的预期工作:

INSERT INTO "Task" (
    "taskType", "taskComment", "taskDate"
) VALUES (
    'abc', 'my comment', '2013-03-17'
)

如果您确实将其列在 INSERT 中,则必须确保提供的值不会与任何使用的值冲突 - 这通常很难满足,除非您始终使用 nextval('some_sequence')

【讨论】:

    【解决方案2】:

    @mvp's answer 几乎涵盖了这一点。除了出于某种原因您(必须)在列列表中添加id 列的情况。然后您可以使用关键字DEFAULT 来默认为定义的默认值。是的,这句话中有很多“默认”,但应该是正确的。 :)

    INSERT INTO "Task"("taskID", "taskType", "taskComment", "taskDate")
    VALUES (DEFAULT, 'HomeWork', 'No Comment', '2013-03-03');
    

    您还最好使用 ISO 8601 日期格式 (YYYY-MM-DD),该格式独立于语言环境设置。您的区域有效格式容易损坏。


    但是,如果您远离愚蠢地使用 mixed case identifiers 开始,那么您在 PostgreSQL 中的生活将会简单得多:

    CREATE TABLE task (
      task_id serial NOT NULL PRIMARY KEY,
      task_type text NOT NULL,
      task_comment text NOT NULL,
      task_date date NOT NULL
    );
    
    INSERT INTO task
    VALUES (DEFAULT, 'HomeWork', 'No Comment', '2013-03-03');
    

    或者更好:

    INSERT INTO task (task_type, task_comment, task_date)
    VALUES ('HomeWork', 'No Comment', '2013-03-03');
    

    【讨论】:

    • 我只是想强调这样一种观点,即在所有 INSERT 语句中列出列比依赖它们定义的顺序要好得多。它使代码更具可读性和健壮性。
    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 2011-10-07
    相关资源
    最近更新 更多