@dba_ru

Страница 520 из 718
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
Сязка первичного ключа с внешним ключем
А в конце вот SELECT 1 - это как понять? Чот не осиливаю))

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:12:30
Точнее, было бы веселее если бы это был прод с кучей данных и у тебя идентификаторы пересеклись тогда бы апдейт прошел. Получился бы охуительный запрос Шреденгера

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

Конечно нету, ведь ты соединяешь по pools.id а не по pools.users_id как надо в обоих случаях
Неа, не работает. WITH q0 AS ( SELECT id FROM users WHERE chat_id = $1), q1 AS (UPDATE pools SET pool = $2 FROM q0 WHERE q0.id = pools.users_id), q2 AS (UPDATE address SET addr = $3 FROM q0 WHERE q0.id = address.users_id) SELECT 1;

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

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

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

Dmitrii
29.05.2018
05:19:26
Ну это PG только
Ну может потому что PG состоит из стандарта SQL а не костылей?)

Я так и делаю.
Покажи что в таблицах просто

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)

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)

Marlik
29.05.2018
05:25:15
Ну кек. А в таблицы address и pools кто данные добавлять будет? Нет данных нет апдейта
Эм, точно. А там-то пока их не должно быть, что прописать-то? Чё нить not null?

Dmitrii
29.05.2018
05:26:57
Эм, точно. А там-то пока их не должно быть, что прописать-то? Чё нить not null?
Посмотри в доке как поменять UPDATE на INSERT ... ON CONFLICT DO UPDATE что-то типа того. Называется upsert

Тогда когда записи нет ее добавит, когда есть - обновит.

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 бы согласился, я уверен )

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
Выбери id юзера и добавь этот ключ вместе с остальными данными в таблицу
Ну тогда это криво будет, где в каждой таблице, лежит айдишник юзера.

Когда экзамен то лучше скажи?
Не скоро, приложение нужно дописать ещё.

Dmitrii
29.05.2018
05:44:19
Что бы думал? Учился формулировать вопросы? Понимал сам что именно ему нужно?
Работал бы ты в Европе - уволили бы уже же за non culture fit. Каким бы ты там классным технарем не ни был.

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
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
Не понимаю, ON CONFLICT (did) DO UPDATE SET dname = EXCLUDED.dname; при конфликте таблицы did, я что-то должен сделать с другой таблицей? Ужос))

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
Нет

Их оставить

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

Al
29.05.2018
06:13:01
Если ты пытаешься этот кейс притянуть к кейсу с 64ю запросами, когда текущий кейс не имеет ничего общего с производительностью и до сих пор понять этого не можешь то либо у тебя с юмором туго либо тебе уже ничего не поможет)
Если ты не понимаешь что много и даже очень много простых селектов будут всегда дешевле запуска функции и прочего сложно вывернутого хардкора напиханого в один запрос. То тебе есть еще куда расти. Но ты не спеши конечно. Всегда же можно попробовать завалить железом.

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 куда приглашаем всех спецов по данной технологии. Вместе решать вопросы, проводить конференции легче, так что присоединяйтесь !

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
Алгоритмы. Логика. Просто раставь кнопочки мышкой и в продакшен

Хорошо для прототипирования. Но сильно сомневаюсь что не придется потом носится с попаболью под нагрузкой

Хотя вполне логичное развитие

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

Al
29.05.2018
07:19:00
Насчет производительности http://telegra.ph/How-fast-is-ORDS-04-04
1000 запросов в секунду на 16 ядрах и 64гигах оперативки? Это какой то прикол?

Страница 520 из 718