
Ilia
28.05.2018
17:57:26
Ты в курсе как пользователи в MySQL устроены?

Захар
28.05.2018
17:57:41
нет
я не в курсе всего mysql

Ilia
28.05.2018
17:59:56
Mysql использует в виде пользователей пару логин в БД и хост, с которого он пришёл.
Можно также использовать пользователей с т.н. маской, где хост задан как '*' (кажется, так).
Т.е. если ты создашь пользователя misha@mywebfront, то только миша с этого хоста mywebfront сможет так вот зайти и работать с БД.

Google

Ilia
28.05.2018
18:00:21
Подробности читай в доке по MySQL

Marlik
29.05.2018
04:26:34

Ilia
29.05.2018
04:52:33
Это типа драйвер, запускалка.
Кроме CTE же должен быть какой то запрос, главный.
А там он не нужен.
Все в CTE. Вот в конце и стоит пустой запрос выбирающий одну записи с одним полем.
Но я вот не уверен, что так можно.


Marlik
29.05.2018
05:01:28
Сейчас вот так:
CREATE TABLE if NOT EXISTS users (
id serial PRIMARY KEY,
chat_id integer UNIQUE
);
CREATE TABLE if NOT EXISTS pools (
id serial PRIMARY KEY,
pool text UNIQUE,
users_id integer not null,
foreign key(users_id) references users(id) on delete cascade on update cascade
);
CREATE TABLE if NOT EXISTS address (
id serial PRIMARY KEY,
addr text UNIQUE,
users_id integer not null,
foreign key(users_id) references users(id) on delete cascade on update cascade
);
Делаю запрос:
WITH q0 AS ( SELECT id FROM users WHERE chat_id = $1),
q1 AS (UPDATE pools SET pool = $2 FROM q0 WHERE q0.id = pools.id),
q2 AS (UPDATE address SET addr = $3 FROM q0 WHERE q0.id = address.id)
SELECT 1;
Вроде бы всё верно, отрабатывает, но в базе апдейта нет. on update cascade может на это влиять?


Dmitrii
29.05.2018
05:11:07
Сейчас вот так:
CREATE TABLE if NOT EXISTS users (
id serial PRIMARY KEY,
chat_id integer UNIQUE
);
CREATE TABLE if NOT EXISTS pools (
id serial PRIMARY KEY,
pool text UNIQUE,
users_id integer not null,
foreign key(users_id) references users(id) on delete cascade on update cascade
);
CREATE TABLE if NOT EXISTS address (
id serial PRIMARY KEY,
addr text UNIQUE,
users_id integer not null,
foreign key(users_id) references users(id) on delete cascade on update cascade
);
Делаю запрос:
WITH q0 AS ( SELECT id FROM users WHERE chat_id = $1),
q1 AS (UPDATE pools SET pool = $2 FROM q0 WHERE q0.id = pools.id),
q2 AS (UPDATE address SET addr = $3 FROM q0 WHERE q0.id = address.id)
SELECT 1;
Вроде бы всё верно, отрабатывает, но в базе апдейта нет. on update cascade может на это влиять?
Конечно нету, ведь ты соединяешь по pools.id а не по pools.users_id как надо в обоих случаях

Marlik
29.05.2018
05:11:37

Dmitrii
29.05.2018
05:12:30
Точнее, было бы веселее если бы это был прод с кучей данных и у тебя идентификаторы пересеклись тогда бы апдейт прошел. Получился бы охуительный запрос Шреденгера

Marlik
29.05.2018
05:12:49
До прода ещё далеко)))

Dmitrii
29.05.2018
05:15:45
А в конце вот SELECT 1 - это как понять? Чот не осиливаю))
@MasterZiv здесь все верно написал. Это основной запрос. Но многие в угоду не знания SQL даже подумать не могут что так можно написать, что не обязательно выбирать что-то из таблиц, но так можно и законом не запрещено. Вместо него можно было бы выбрать все из q0 чтобы никого не путать


Ilia
29.05.2018
05:17:04
Сейчас вот так:
CREATE TABLE if NOT EXISTS users (
id serial PRIMARY KEY,
chat_id integer UNIQUE
);
CREATE TABLE if NOT EXISTS pools (
id serial PRIMARY KEY,
pool text UNIQUE,
users_id integer not null,
foreign key(users_id) references users(id) on delete cascade on update cascade
);
CREATE TABLE if NOT EXISTS address (
id serial PRIMARY KEY,
addr text UNIQUE,
users_id integer not null,
foreign key(users_id) references users(id) on delete cascade on update cascade
);
Делаю запрос:
WITH q0 AS ( SELECT id FROM users WHERE chat_id = $1),
q1 AS (UPDATE pools SET pool = $2 FROM q0 WHERE q0.id = pools.id),
q2 AS (UPDATE address SET addr = $3 FROM q0 WHERE q0.id = address.id)
SELECT 1;
Вроде бы всё верно, отрабатывает, но в базе апдейта нет. on update cascade может на это влиять?
Commit?

Dmitrii
29.05.2018
05:17:05
Покажи что во всех трёх таблицах

Google

Dmitrii
29.05.2018
05:17:21

Ilia
29.05.2018
05:18:39

Dmitrii
29.05.2018
05:18:49
Во втором окне, в psql или что ты там используешь

Marlik
29.05.2018
05:19:10

Dmitrii
29.05.2018
05:19:26

Marlik
29.05.2018
05:20:08

Ilia
29.05.2018
05:20:58
Commit commit

Dmitrii
29.05.2018
05:21:06
Ну это PG только
В нем и ORDER BY в UNION применится правильно семантически, а не как в MySQL
(hint: там оно применится только ко второму запросу, хотя семантически ты хочешь к результату UNION)

Ilia
29.05.2018
05:22:26

Dmitrii
29.05.2018
05:22:37
Ну прастити

Marlik
29.05.2018
05:22:56
Покажи что в таблицах просто
select * from users;
id | chat_id | lang | notify | repeat | ban_user | ban_adm | dt
----+-----------+------+--------+--------+----------+---------+----------------------------
1 | 377672926 | en | | | f | f | 2018-05-29 08:21:20.023493
(1 row)
miner=# select * from pools;
id | pool | users_id
----+------+----------
(0 rows)
miner=# select * from address;
id | addr | users_id
----+------+----------
(0 rows)

Dmitrii
29.05.2018
05:23:55

Marlik
29.05.2018
05:25:15

Dmitrii
29.05.2018
05:26:57
Тогда когда записи нет ее добавит, когда есть - обновит.

Marlik
29.05.2018
05:27:40

Dmitrii
29.05.2018
05:27:47
Саму структуру запроса особо менять не надо. Только q1 и qß

Google

Dmitrii
29.05.2018
05:28:02
q1 и q2
Спасибо огромное пошёл читать.
INSERT INTO distributors (did, dname) VALUES (5, 'Gizmo Transglobal'), (6, 'Associated Computing, Inc') ON CONFLICT (did) DO UPDATE SET dname = EXCLUDED.dname;
https://www.postgresql.org/docs/9.6/static/sql-insert.html
Вообще твой случай это как раз тот, когда проще открыть транзакцию и насрать в нее 2-3 запроса и сделать commit. @AlexCAD бы согласился, я уверен )

Al
29.05.2018
05:35:57

Marlik
29.05.2018
05:36:20
Смысл в связанных таблицах, так-то были-бы таблицы отдельно друг от друга...

Dmitrii
29.05.2018
05:37:27
CTE нужен для упрощения читабельности реально сложных запросов.
Ты же в свою очередь читабельность понизил им

Marlik
29.05.2018
05:39:15
Я прост логически не улавливаю, как обновить таблицу и привязать что эти данные принадлежат такому-то юзеру.

Dmitrii
29.05.2018
05:40:09
Выбери id юзера и добавь этот ключ вместе с остальными данными в таблицу
Когда экзамен то лучше скажи?

Al
29.05.2018
05:40:55

Dmitrii
29.05.2018
05:42:05

Al
29.05.2018
05:43:09

Marlik
29.05.2018
05:43:11

Dmitrii
29.05.2018
05:44:19

Al
29.05.2018
05:44:45

Dmitrii
29.05.2018
05:45:21

Google

Al
29.05.2018
05:46:35
В русской резервации походу
В еврейской ты имеешь в виду? Неее. Спасибо. Меня там только на год хватило. Нафиг тот гадюшник. Но ты продолжай. Может у тебя даже получится

Dmitrii
29.05.2018
05:50:57

Marlik
29.05.2018
05:57:47

Dmitrii
29.05.2018
05:58:53
did там это поле которое конфликтует между записью что уже существует и записью что пошла на вставку
В твоём случае могло бы быть пока users_id - но надо учесть что уже больше одной записи твой запрос не добавит
Вообще вся идея с CTE + INSERT ... ON CONFLICT ... полностью отбитая.

Marlik
29.05.2018
06:03:10
Чото сложно, может пихнуть not nill default "что-то"?

Admin
ERROR: S client not available

Marlik
29.05.2018
06:03:31
И потом спокойно апдетить?

Dmitrii
29.05.2018
06:03:38
Нет
Чтобы проще - просто выкини нахер эту бредовую идею и распили на два запроса в транзакции
Или даже без транзакции

Marlik
29.05.2018
06:04:44
Ну тогда и от связанных таблиц отказаться?

Dmitrii
29.05.2018
06:04:51
Нет
Их оставить

Al
29.05.2018
06:06:05

Dmitrii
29.05.2018
06:10:51
Нееее. Аж 2 запроса.. это же феил..
Если ты пытаешься этот кейс притянуть к кейсу с 64ю запросами, когда текущий кейс не имеет ничего общего с производительностью и до сих пор понять этого не можешь то либо у тебя с юмором туго либо тебе уже ничего не поможет)

Al
29.05.2018
06:13:01

Dmitrii
29.05.2018
06:13:37
Снова этот буллщит
Да тут все поняли уже кто батя в чате, ты не переживай! Я тебе не конкурент.

Google

Al
29.05.2018
06:16:11
Дык а что переживать. Подобных тебе (запихну все в один запрос, если сервер может то пусть и пашет) тут за 3 года уже целый полк прошел. ?

Dmitrii
29.05.2018
06:17:01
Как компания то называется?
Большая_Выдуманная_Компания_Без_Имени - понял.

Al
29.05.2018
06:21:24
Забавный?

Alexey
29.05.2018
06:26:28
Есть много разработчиков которые используют технологию Oracle Apex, но в основном это не публичные, финансовые или банковские продукты. Мы создали телеграм канал t.me/orclapex куда приглашаем всех спецов по данной технологии. Вместе решать вопросы, проводить конференции легче, так что присоединяйтесь !

Ilia
29.05.2018
06:43:50

Al
29.05.2018
07:02:39
Три, один же ещё должен id выбрать!
Это вообще уже нереальная нагрузка на сервер. Ты разве не в курсе что количество запросов повышает нагрузку. И нагрузка зависит только от количества и сложность никак не влияет на нагрузку

Alexey
29.05.2018
07:03:06
Напомни APEX что?
Apex это платформа для веб разработки которую Oracle сейчас активно развивает (я считаю что в будущем заменят Java ADF на Apex). https://apex.oracle.com/en/

Al
29.05.2018
07:05:10
Алгоритмы. Логика. Просто раставь кнопочки мышкой и в продакшен
Хорошо для прототипирования. Но сильно сомневаюсь что не придется потом носится с попаболью под нагрузкой
Хотя вполне логичное развитие

Alexey
29.05.2018
07:13:21

Ilia
29.05.2018
07:16:23

Виктор
29.05.2018
07:18:39
Хорошо спроектированные подобные системы-конструкторы не намного хуже все переводят в "нативное" представление. Но экономия времени, порой составляет 1000-2000%
Взять те же компиляторы, никто сейчас и не задумывается, как он там делает преобразования, но уже доказано, что хороший компилятор куда эффективнее оптимизует код, чем большиство программистов способны написать.

Al
29.05.2018
07:19:00