Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как правильно написать update? / 14 сообщений из 14, страница 1 из 1
30.01.2016, 02:22
    #39159078
Viacheslav_mihalich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
Доброй ночи!

В таблице TAG_IDS находятся уникальные записи по полю NAME

А в таблице TAGS эти же NAME - не уникальны (дублируются).

Задача: в TAGS.TAG_ID записать TAG_IDS.ID, где TAGS.NAME = TAG_IDS.NAME

описание таблиц:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
CREATE TABLE "TAGS"
(
  "ID" bigint NOT NULL DEFAULT nextval('"TAGS_seq"'::regclass),
  "NAME" character varying(256) NOT NULL,
  "DOCTOR_TYPE_ID" integer,
  "DOCTOR_ID" bigint,
  "IS_PRINT" boolean,
  "TAG_ID" bigint,
  CONSTRAINT "TAGS_pkey" PRIMARY KEY ("ID"),
  CONSTRAINT "DOCTOR_ID2" FOREIGN KEY ("DOCTOR_ID")
      REFERENCES "DOCTORS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT "DOCTOR_TYPE_ID3" FOREIGN KEY ("DOCTOR_TYPE_ID")
      REFERENCES "DOCTOR_TYPE_IDS" ("ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT positive_doctor_id CHECK ("DOCTOR_ID" > 0),
  CONSTRAINT positive_doctor_type_id CHECK ("DOCTOR_TYPE_ID" > 0)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "TAGS"
  OWNER TO postgres;

-- Index: duplicate__name__doctor_id

-- DROP INDEX duplicate__name__doctor_id;

CREATE UNIQUE INDEX duplicate__name__doctor_id
  ON "TAGS"
  USING btree
  ("NAME" COLLATE pg_catalog."default", "DOCTOR_ID");

-- Index: duplicate__name__doctor_type_id

-- DROP INDEX duplicate__name__doctor_type_id;

CREATE UNIQUE INDEX duplicate__name__doctor_type_id
  ON "TAGS"
  USING btree
  ("NAME" COLLATE pg_catalog."default", "DOCTOR_TYPE_ID");

-- Index: "fki_DOCTOR_ID2"

-- DROP INDEX "fki_DOCTOR_ID2";

CREATE INDEX "fki_DOCTOR_ID2"
  ON "TAGS"
  USING btree
  ("DOCTOR_ID");

-- Index: "fki_DOCTOR_TYPE_ID3"

-- DROP INDEX "fki_DOCTOR_TYPE_ID3";

CREATE INDEX "fki_DOCTOR_TYPE_ID3"
  ON "TAGS"
  USING btree
  ("DOCTOR_TYPE_ID");



и

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE "TAG_IDS"
(
  "ID" bigint NOT NULL DEFAULT nextval('"TAG_IDS_seq"'::regclass),
  "NAME" character varying(64),
  CONSTRAINT "TAG_IDS_pkey" PRIMARY KEY ("ID"),
  CONSTRAINT unique_tag_ids UNIQUE ("NAME")
)
WITH (
  OIDS=FALSE
);
ALTER TABLE "TAG_IDS"
  OWNER TO postgres;
...
Рейтинг: 0 / 0
30.01.2016, 13:15
    #39159154
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
Привет, Viacheslav_mihalich.

Что-от типа
Код: plsql
1.
2.
3.
update tags
   set tag_id = ( select id from tags_ids
                   where name = tags.name );


С уважением, Polesov.
...
Рейтинг: 0 / 0
30.01.2016, 13:35
    #39159159
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
Polesov,

незнаю действительно луче или нет, но мне болше нравится форма
Код: sql
1.
2.
3.
4.
UPDATE tags AS t
SET tag_id = i.id
FROM tags_ids AS i
WHERE i.name = t.name;
...
Рейтинг: 0 / 0
30.01.2016, 13:55
    #39159165
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
Lonepsycho, может быть и лучше, но могу только сказать, что мой запрос выполнится на любом SQL-сервере, а приведенный тобой - нет (на Firebird точно не выполнится). Хотя согласен - форма более лаконичная.
...
Рейтинг: 0 / 0
30.01.2016, 15:14
    #39159190
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
Polesov, жаренный питух -- не субд. узбагойтесь.
...
Рейтинг: 0 / 0
30.01.2016, 15:25
    #39159199
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
qwwq, огласите весь список пжлста
...
Рейтинг: 0 / 0
30.01.2016, 15:29
    #39159201
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
Polesov,

в питухе рид--коммитеда, кажись, исторически не было. это характеризует разрабов версионника(!), Карл(!), как проф--непригодных рукожопов. привет сибирякову.
...
Рейтинг: 0 / 0
30.01.2016, 15:33
    #39159202
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
qwwq,

Понятно - список состоит из одной позиции.

За сим позвольте откланяться
...
Рейтинг: 0 / 0
30.01.2016, 16:06
    #39159209
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
Polesov,

предпочитаю с каждым разговаривать на ему понятном языке. не верю в один запрос для разных дб. как по мне, так это путь в никуда, потому что так вы обречены на использование судб на максимум 30%.
...
Рейтинг: 0 / 0
30.01.2016, 16:25
    #39159214
Viacheslav_mihalich
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
Polesov и Lonepsycho - спасибо за ответы! Вопрос решен.

Я, видимо, мог бы и сам догадаться, но в 3 часа ночи ничего уже не соображал.
А сделать нужно было срочно.
...
Рейтинг: 0 / 0
31.01.2016, 14:38
    #39159460
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
Если бы cлон поддерживал стандартный MERGE...
...
Рейтинг: 0 / 0
01.02.2016, 14:51
    #39160254
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
Dimitry SibiryakovЕсли бы cлон поддерживал стандартный MERGE...
я чо его поддерживать ? он чо -- падает ?


при питуховом snapshot i.e. repeatable read
WITH .. as ( UPDATE ..... RETURNING ...) INSERT .... WHERE {not found}
кажисть вполне себе полноценный мёрж. -- при ошибке вполне себе упадёцца. (по ошибке уровня изоляции)
или я не прав ?
поправьте, чота лень подпризадуматься или потестить.

а для read commited пришлось немного честнее стандартного посмотреть на проблему. написали более трульный
INSERT .... ON CONFLICT [blahblah]... [не тестил пока руками]
кактотаг
...
Рейтинг: 0 / 0
02.02.2016, 14:52
    #39161119
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
qwwqя чо его поддерживать ? он чо -- падает ?
Тогда почему ТС его не использует и никто ему это не советует?..
...
Рейтинг: 0 / 0
02.02.2016, 15:05
    #39161127
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как правильно написать update?
Dimitry Sibiryakovqwwqя чо его поддерживать ? он чо -- падает ?
Тогда почему ТС его не использует и никто ему это не советует?..
1. наверное потому, что он ТС-у тут не нужен
от слова "совсем"

2. наверное потому, что это всем понятно



я бы ещё спросил автора, заради чего они денормализовали табличку. т.е. кроме ид тагов ввели и сами имена тагов. сомнительно догадываюсь -- для сложного поиска по LIKE по тагам, и прочим параметрам. но как--то вот не очевидно, что это нужно делать. т.е. что они хоть что--то тут выигрывают. А вот проиграть можно в удобстве. но поскольку третьего дня мне было лень задавать ТС эти вопросы -- то и на технику апдейта вновь добавленного поля задним числом мне положить. но мердж там не нужен со всей очевидностью. для практикующего кодера это очевидно.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как правильно написать update? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]