11

我使用 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');
4

2 回答 2

19

@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),它独立于区域设置工作。您的区域有效格式容易损坏。


但是,如果您一开始就远离使用混合大小写标识符的愚蠢行为,那么您在 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');
于 2013-03-17T19:15:57.460 回答
4

你不应该语句中列出这个自动递增的列INSERT,它会像你期望的那样工作:

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

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

于 2013-03-17T19:01:09.917 回答