単純なPostgreSQL挿入を機能させることができません


82

postgresテーブルに単純な挿入を行おうとしていますが、挿入しようとしている値が列名として解釈されているというエラーが発生します

INSERT INTO "imageTagBusinessMainCategory"
(id, businessMainCategory)
VALUES
(DEFAULT, "auto dealer")

ここで、idは主キーであり、nullではなく自動インクリメントするように設定されています。これらは、phpPgAdminでテーブルを設定するときにチェックしたボックスです。

ただし、このエラーが発生します。

ERROR: ERROR: column "auto dealer" does not exist
Query = INSERT
INTO "imageTagBusinessMainCategory"
(id, businessMainCategory)
VALUES
(DEFAULT,
"auto dealer")

ここで読んだように、テーブル名を二重引用符で囲んでいます。

そしてDEFAULT、私がここで読んだように、IDを自動インクリメントするために使用されます。

何か案は?ありがとう!


13
「自動車ディーラー」には一重引用符を使用してください。
muratgu 2012

2
一重引用符。IDは省略してください。
ポールトゥームリン2012

エラーが発生するERROR: ERROR: syntax error at or near "'imageTagBusinessMainCategory'" Position: 13
@muratgu

@PaulTomblin「IDを省く」とはどういう意味ですか?ありがとう!
1252748 2012

@Randyの答えにあるように。列名も二重引用符で囲む必要があるように見える場合を除きます。
ポールトゥームリン2012

回答:


165

'auto dealer'代わりに使用してください。PostgreSQL"は、識別子の'引用符として、文字列の引用符として解釈します。

また:

  • これが新しいプロジェクトの場合は、大文字と小文字が混在するテーブルを使用しないでください。それは後で欲求不満の原因になります。SQLステートメントで大文字と小文字を区別する代わりに、識別子名を引用符で囲み、大文字と小文字を正しく区別する必要があります。

  • id/を指定する必要はありませんDEFAULT、あなたはそれがすでに行ったであろうことをするようにそれを求めています。列にデフォルト値を入れたい場合はcolumnName/を含める必要があるDBMSに会ったことがないDEFAULTので、この余分なKVペアによって、後でコードを読む人に何が起こっているのかが明確になるとは思いません。 。


それは私にこのエラーを与えますERROR: ERROR: column "businessmaincategory" of relation "imageTagBusinessMainCategory" does not exist
1252748 2012

1
テーブル名と同じように、大文字と小文字が混在する列を作成した可能性があります。この場合は、列名も引用する必要があります。ネーミングで大文字と小文字を混在させることをやめれば、誰もが多くの苦痛を軽減できます。
マット

@Matt私は同じ問題に直面しており、C ++でpgを使おうとすると、それらの二重引用符を入力する必要があるときに苦痛になります。これらの引用符の必要性を排除するいくつかの設定のような回避策はありませんか?
itsols 2013

@itsols「Also」の最初の弾丸は引用符の必要性を排除します。[a-z0-9]のみを使用してIDを定義し、特定のケースがあると指定しないでください(引用せずに定義してください)。次に、引用符なしでいつまでもそれらを参照できます。あなたや他の誰かが、スペース付きまたはキャメルケースのテーブル名を持つことが本当に重要であると判断した場合は、どこでも引用して楽しんでください!
マット

よく理解されているマット...ある意味でキャメルケースに慣れたばかりだと思います-久しぶりです(20年以上)...実際、問題は二重引用符ではありません(はい、もっと簡単でしょう)それなしで)、しかし本当の苦痛はそれらをひもで逃がさなければならないことです。C ++とpgを組み合わせるまで、これが来るのを見ませんでした。とにかくあなたの入力をありがとう!
itsols 2013

9
INSERT INTO "imageTagBusinessMainCategory"
("businessMainCategory")
VALUES
('auto dealer')

編集:列名の前後に二重引用符を追加しました


1
ありがとね。それは、このエラーを与える:ERROR: ERROR: column "businessmaincategory" of relation "imageTagBusinessMainCategory" does not exist
1252748

列名も二重引用符で囲む必要があるようです。PostgreSQLで大文字と小文字が混在するテーブル名が悪い考えである理由の1つ。
David Faber

@DavidFaberええ、その通りです。でも読みづらくなります。ダッシュは使えますか?^^
1252748 2012

1
@DavidFaber:個人的には、引用符が必要な識別子(大文字と小文字が混在するなど)はどのDBMSでも悪い考えだと思います
a_horse_with_no_name 2012

1
識別子を作成する場合を除いて、大文字と小文字を組み合わせて引用符なしで参照できることに注意してください。したがって、という名前のテーブルには、thishasareallylongnameを使用してアクセスできますselect * from thisHasAReallyLongName
マット

4

Postgres、Oracleなどは、大文字と小文字が混在している場合、列名が引用符で囲まれていることを想定しています。したがって、テーブル列にすべて小さいまたはすべて大文字の規則を作成するか、DavidFaberが提案したように引用符を使用します

INSERT INTO "imageTagBusinessMainCategory"
("businessMainCategory")
VALUES
('auto dealer')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.