2013-03-17 94 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')