не вдається запустити просту вставку PostgreSQL


83

Я намагаюся зробити просту вставку в таблицю postgres, але отримую помилку, що значення, яке я намагаюся вставити, інтерпретується як ім'я стовпця

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

Де ідентифікатор встановлений як первинний ключ, і автоматичне збільшення, а не нуль. Це ті прапорці, які я позначив, коли налаштовував таблицю в phpPgAdmin.

Однак я отримую цю помилку:

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

Я вказав назву таблиці в подвійних лапках, як я вже прочитав тут .

І раніше використовував DEFAULTдля автоматичного збільшення ідентифікатора, як я вже прочитав тут .

Будь-які ідеї? Дякую!


14
використовуйте одинарні лапки для "автодилера".
muratgu

3
Одинарні лапки. Залиште ідентифікатор.
Пол Томблін,

@muratgu, що видає помилку:ERROR: ERROR: syntax error at or near "'imageTagBusinessMainCategory'" Position: 13
1252748

@PaulTomblin як ви маєте на увазі "залишити ідентифікатор"? Дякую!
1252748

Я маю на увазі, як це видно у відповіді @ Randy. За винятком того, що, здається, вам потрібні подвійні лапки навколо назви стовпця.
Пол Томблін,

Відповіді:


167

Використовуйте 'auto dealer'замість цього. PostgreSQL інтерпретує "як лапки для ідентифікаторів, 'як лапки для рядків.

Також:

  • Якщо це новий проект, просто не використовуйте змішані таблиці регістрів; це викликає розчарування пізніше. Замість того, щоб мати можливість використовувати будь-який регістр у своїх операторах SQL, ви обоє повинні вказати ім'я ідентифікатора і правильно вказати регістр.

  • Не потрібно вказувати id/ DEFAULT, ви просите його зробити те, що він би вже зробив. Я не зустрічав СУБД, яка вимагає від вас включення columnName/ DEFAULTякщо ви хочете, щоб у стовпчик було введено значення за замовчуванням, тому я не думаю, що ця зайва пара KV зробить зрозумілішим те, що відбувається, кожному, хто читає ваш код пізніше .


це дає мені цю помилкуERROR: ERROR: column "businessmaincategory" of relation "imageTagBusinessMainCategory" does not exist
1252748

1
Можливо, ви створили стовпець у змішаному регістрі, як і назва таблиці. Ви також повинні вказати назву стовпця, якщо це так. Перестаньте застосовувати змішаний регістр при іменуванні, і ви врятуєте всіх багато болю.
Метт

@Matt Я стикаюся з тією ж проблемою, і намагання використовувати pg з C ++ - це біль, коли мені доводиться вводити ці подвійні лапки. Чи не є такий спосіб вирішення, як якийсь параметр, який усуне потребу в цих цитатах?
itols

@itsols Кулак куля "Також" усуне потребу в котируваннях; визначайте свої ідентичності лише за допомогою [a-z0-9] і не вказуйте їх як такі, що мають певний регістр (визначайте без цитування). Тоді ви можете посилатися на них, як хочете, без лапок назавжди. Якщо ви або хтось інший вирішив, що насправді важливо мати назви таблиць з пробілами або у випадку з верблюдом, отримуйте задоволення, цитуючи скрізь!
Matt

Справа добре сприйнята Метт ... Я думаю, я щойно звик до CamelCase - це було довгий час (понад 20 років) ... Насправді проблема не в подвійному цитуванні (так, це було б простіше без цього), але справжній біль полягає в тому, щоб рятуватися від них струнами. Я не бачив цього, поки не поклав C ++ і pg разом. Все одно дякую за ваші вклади!
itols

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

EDIT: Додано подвійні лапки навколо назви стовпця


1
Привіт, спасибі. це дає цю помилку:ERROR: ERROR: column "businessmaincategory" of relation "imageTagBusinessMainCategory" does not exist
1252748

Здається, вам також потрібно ввести назву стовпця у подвійні лапки. Одна з причин, чому назви таблиць із різними регістрами в PostgreSQL - погана ідея.
Девід Фабер,

@DavidFaber так, ти маєш рацію. це ускладнює читання, хоча .. чи можу я використовувати тире? ^^
1252748

1
@DavidFaber: особисто я вважаю, що ідентифікатори, які потребують цитування (наприклад, змішаний регістр), є поганою ідеєю в будь-якій СУБД
a_horse_with_no_name

1
Майте на увазі, що скрізь, окрім створення даних ідентифікатора, ви можете посилатися на нього у змішаному регістрі та без лапок. Отже, доступ до названої таблиці thishasareallylongnameможна отримати за допомогою select * from thisHasAReallyLongName.
Метт

4

Postgres, Oracle тощо очікують, що ім'я стовпця буде в лапках, якщо вони мають змішаний регістр. Тож або створіть домовленість усіх малих або всіх обмежень для стовпців таблиці, або використовуйте лапки, як запропонував Девід Фабер

INSERT INTO "imageTagBusinessMainCategory"
("businessMainCategory")
VALUES
('auto dealer')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.