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")
)

serial自動的にインクリメントされるデータ型として taskID を入れました。INSERTテーブルの最初の列は自動的にインクリメントされるはずですが、 INSERTステートメントは自分で値を挿入するように求めているため、ステートメントの使用方法がわかりません。何か案が?

これが私の挿入ステートメントです:

INSERT INTO "Task" VALUES ('HomeWork', 'No Comment', '3/3/2013');
4

2 に答える 2

19

@mvpの答えはこれをかなりカバーしています。id何らかの理由で列リストに列を追加する(しなければならない)場合を除きます。次に、キーワードDEFAULTを使用して、定義済みのデフォルト値にデフォルト設定できます。ええ、この文には「デフォルト」がたくさんありますが、正しいはずです。:)

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

YYYY-MM-DDまた、ロケール設定とは無関係に機能する ISO 8601 日付形式 ( ) を使用することをお勧めします。地域的に有効な形式は破損しがちです。


ただし、最初から大文字と小文字が混在する識別子を使用するという愚かなことから距離を置くと、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 に答える