2013-03-17 95 views
4

我使用PostgreSQL,我创建了如下表:Insert语句问我插入自动增量列

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 2013-03-17 19:00:20

+0

程序员如何在不显示INSERT语句的情况下询问此问题? – 2013-03-17 19:03:04

+0

@ErwinBrandstetter已添加。 – Aan 2013-03-17 19:07:57

回答

10

@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'); 
+2

我只是想强化这样的观点,即在所有INSERT语句中列出列是比依赖它们定义的顺序更好的做法。它使代码更具可读性和更强大。 – IMSoP 2013-03-17 22:06:32

3

你应该列表INSERT声明中自增的字段,它会按照您期望:

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

如果你这样做将其列在INSERT中,您必须确保提供的值与任何使用的值不冲突 - 一般情况下难以满足,除非您始终使用nextval('some_sequence')