|
|
|
INSERT INTO ON CONFLICT
|
|||
|---|---|---|---|
|
#18+
В 9.5 версии появился так называемый upsert Пример из хелпа: Код: sql 1. 2. 3. У меня в таблице около 20 колонок, можно как-то укоротить запись чтоб не писать для каждой колонки чему она равна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 20:58 |
|
||
|
INSERT INTO ON CONFLICT
|
|||
|---|---|---|---|
|
#18+
koltsукоротить записьчернила в клавиатуре экономишь? можешь сэкономить на знаках равенства за счет запятых. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 21:20 |
|
||
|
INSERT INTO ON CONFLICT
|
|||
|---|---|---|---|
|
#18+
Нужно это прописать где то для 10 таблиц. Где то 1 час скучной работы. Если нет более короткой записи сделаю без проблем но для общего развития хочется знать. Вам же лучше остроумие экономить, а то заканчивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 21:28 |
|
||
|
INSERT INTO ON CONFLICT
|
|||
|---|---|---|---|
|
#18+
kolts, Как администратор скажу, что очень много проблем приходит от желания разработчиков сэкономить (это общее наблюдение, не воспринимайте лично). Потратить не 3 минуты на копипаст, а 15 на нормальное написание запроса очень неплохо, если предполагается, что запрос потом долгое время работать в продукции и не доставлять боли. И пока не окажешься в шкуре того, кто решает проблемы в продукции, а не в юнит-тестах — об этом не задумываешся. В данном случае `did` скорее всего ключ и, соответственно, на нём индекс. Если индекса на `dbname` нет и сделать как в доке, то вы получите HOT update. Если выкрутиться и сделать как проще (сэкономить 10 минут), то сокрее всего запись будет меняться целиком, включая все индексные поля. Тот факт, что значение (скажем `did`) не меняется (меняется на такое же), базу не волнует — изменит, при этом обновив все индесы. Дольше UPDATE, больше блокировок, больше индексы, дольше vaccum. По существу. На той же странице в доке, в самом верху, есть все возможные варианты: http://www.postgresql.org/docs/current/interactive/sql-insert.html and conflict_action is one of: DO NOTHING DO UPDATE SET { column_name = { expression | DEFAULT } | ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) | ( column_name [, ...] ) = ( sub-SELECT ) } [, ...] [ WHERE condition ] Я не вижу вариантов как сделать короче... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 23:11 |
|
||
|
INSERT INTO ON CONFLICT
|
|||
|---|---|---|---|
|
#18+
Придется для всех полей писать set = exclided.value, мы же не знаем какие из них поменялись. А полей может быть 40 или 50 (у меня пока максимум в моей программе 33), получается надо все поля присвоить кроме одного, по которому идет проверка на уникальность. Это конечно мелочи, но думал может быть есть что то удобнее чем сначала делать вставку нескольких десятков полей, а потом этим же нескольким десяткам полей присваивать значения. Возможно скоро появится синтаксис on conflict (column) do update, что будет подразумевать обновить все остальные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 23:52 |
|
||
|
INSERT INTO ON CONFLICT
|
|||
|---|---|---|---|
|
#18+
kolts, резюмируя -- вы хотите синтакс Код: sql 1. /*годное и для NEW */ скопки -- опционально. м.б. row(*)=row(record.*) -- лоббируйте. идея здравая, http://www.sql.ru/forum/820306/golosuem-za-novye-fichi-pg ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 15:16 |
|
||
|
INSERT INTO ON CONFLICT
|
|||
|---|---|---|---|
|
#18+
ЗЫ пока это делается массовым [регексп]реплайсом из описания табличного типа -- немного выдумки -- напишете генератор. то, что писал одмин вегоров в этом случае не канает, тут именно * рулила бы. -- тип копируется в себя и только в себя. хотя если это было бы потенциально 2 разные типа -- то на случай ALTER одного из 2-х возникают варианты, -- или вам бы хотелось, чтобы всё сломалось, чтобы привести к соответстию заложенную логику, и оно ни разу бы неправильно не сработало -- тогда * была бы логически вернее, даже для одминов. Или вы хотели бы , чтобы оно продолжало работать как написано, тогда строгое перечисление было бы верным подходом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 15:23 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39159191&tid=1997483]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
173ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 497ms |

| 0 / 0 |
