插入语句要求我为自动递增列插入数据

12

我使用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")
)

我将任务ID设为serial数据类型,以便自动递增。现在我困惑于如何使用INSERT语句,因为表中的第一列应该自动递增,但是INSERT语句要求我手动插入一个值!有什么建议吗?

这是我的插入语句:

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

1
请展示插入语句。 - mindandmedia
1
程序员如何在不显示“INSERT”语句的情况下提出这个问题? - Erwin Brandstetter
现在是一个好问题。虽然在这种情况下大多数情况下不相关,但应始终包括PostgreSQL 版本 - Erwin Brandstetter
3个回答

20

@mvp的答案基本上就涵盖了。 除了在某些情况下必须将自动递增列添加到列列表中的情况之外。 然后您可以使用关键字DEFAULT来默认为定义的默认值。

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

此外,请使用ISO 8601日期格式(YYYY-MM-DD),该格式不受地区设置的影响。您本地有效的格式容易出错。


然而,如果你远离混合大小写标识符的愚蠢,与Postgres共处变得更加容易:

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');

3
我希望强调这个观点:在所有的 INSERT 语句中列出列名比依靠它们被定义的顺序是更好的做法。这样可以使代码更易读,更加健壮。 - IMSoP

5

INSERT 语句中,不应该列出这个自增列,它会按照你的预期工作:

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

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


0

您可以使用DEFAULT来代替序列列(字段),并像下面展示的那样插入没有列(字段)名称的行:

INSERT INTO Task VALUES 
(DEFAULT, 'HomeWork1', 'No Comment', '3/3/2013'), 
(DEFAULT, 'HomeWork2', 'No Comment', '4/4/2014');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接