Insert语句要求我插入autoincrement列

Aan*_*Aan 9 sql postgresql auto-increment

我使用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")
)
Run Code Online (Sandbox Code Playgroud)

我把taskID作为serial数据类型自动递增.现在我很困惑如何使用该INSERT语句,因为表中的第一列应该自动递增但 INSERT语句要求我自己插入一个值!任何的想法?

这是我的插入声明:

INSERT INTO "Task" VALUES ('HomeWork', 'No Comment', '3/3/2013');
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 17

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

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

您还可以更好地使用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');
Run Code Online (Sandbox Code Playgroud)

或者更好:

INSERT INTO task (task_type, task_comment, task_date)
VALUES ('HomeWork', 'No Comment', '2013-03-03');
Run Code Online (Sandbox Code Playgroud)

  • 我只想强调这样的观点,即在所有INSERT语句中列出列是比依赖它们定义的顺序更好的做法.它使代码更具可读性和更强大. (2认同)

mvp*_*mvp 5

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

INSERT INTO "Task" (
    "taskType", "taskComment", "taskDate"
) VALUES (
    'abc', 'my comment', '2013-03-17'
)
Run Code Online (Sandbox Code Playgroud)

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