我使用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');
答案 0 :(得分:17)
@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');
答案 1 :(得分:4)
你应该不在INSERT
语句中列出这个自动递增的列,它会按预期工作:
INSERT INTO "Task" (
"taskType", "taskComment", "taskDate"
) VALUES (
'abc', 'my comment', '2013-03-17'
)
如果你要在INSERT
中列出它,你必须确保提供的值不会与任何使用的值发生冲突 - 这通常很难满足,除非你一直使用nextval('some_sequence')