Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Заблокирован

Primary key и другие баги mySQL с join на фоне ORDER BY

17.08.2013, 17:03. Показов 3579. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Да, чтобы воспроизвести нужен запрос с left join в конце которого стоит order by и тогда можно увидеть что первичные ключи где-то потерялись. Здесь все четко описано https://bugs.php.net/bug.php?id=47547 Однако дело было в 2009, а я напоролся на те же грабли пару дней назад. Условия такие. wamp на winXP SP2 mySQL 5.6.12. Это сейчас, а позавчера mySQL был где-то в районе 5.3 с теми же самыми симптомами. Я поменял локальный сервер два раза - все осталось как было.

Кроме того, возможно это и связано, при тех же условиях слетает оригинальное имя поля. Превращается в алиас.

Кто-нибудь знает как это починить? Временно я сделал затычку - беру PRI с information_schema, но это значит от API mysqli остается только query. fetch_field походу придется полностью переписывать.

Кстати, еще, предустановленные константы типов полей не совпадают с реальными показаниями API. Мне пришлось показания просто передефайнить.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.08.2013, 17:03
Ответы с готовыми решениями:

MySQL INSERT IGNORE primary key не работает
Нужно запретить вставляться в таблицу повторений. Вот моя таблица follow: f_id sender_id receiver_id 1 19 ...

Violation of Primary key constraint 'PK_otdel'. Cannot insert dupllicate key in object 'dbo.otdel'.
void __fastcall TAddOtdForm::AddOtdButton1Click(TObject *Sender) { int kodotd; MainForm->OtdelADOQuery1->Last(); kodotd =...

Зачем нужны primary key и foreign key?
Пожалуйста, объясните самым простым языком зачем эти ключи нужны? Какова их функция? Как они работают? В чём приемущество?

22
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
17.08.2013, 19:25
Цитата Сообщение от sqlnub Посмотреть сообщение
Да, чтобы воспроизвести нужен запрос с left join в конце которого стоит order by и тогда можно увидеть что первичные ключи где-то потерялись. Здесь все четко описано https://bugs.php.net/bug.php?id=47547
MySQL
1
2
3
4
select cn.id 
from c_news cn 
LEFT JOIN c_news_categories cc ON cc.id = cn.area 
ORDER BY cc.name;
Однако дело было в 2009, а я напоролся на те же грабли пару дней назад. Условия такие. wamp на winXP SP2 mySQL 5.6.12. Это сейчас, а позавчера mySQL был где-то в районе 5.3 с теми же самыми симптомами. Я поменял локальный сервер два раза - все осталось как было.

Кроме того, возможно это и связано, при тех же условиях слетает оригинальное имя поля. Превращается в алиас.

Кто-нибудь знает как это починить? Временно я сделал затычку - беру PRI с information_schema, но это значит от API mysqli остается только query. fetch_field походу придется полностью переписывать.

Кстати, еще, предустановленные константы типов полей не совпадают с реальными показаниями API. Мне пришлось показания просто передефайнить.
Как там у классика? "На зеркало неча пенять, коли рожа крива!"
В запросе явным образом указано, что первичный ключ использовать нельзя. И тут же автор запроса возмущенно удивляется тому, что запрос действительно не использует первичный ключ...

Автор, в чердаке порядок наведи, прежде чем о новом баге заявлять
0
Заблокирован
17.08.2013, 19:53  [ТС]
Ничего не понял. Для тех у кого на чердаке порядок вопрос:

свойства поля могут поменяться в результате сортировки полей?

Добавлено через 56 секунд
И почему чего нельзя использовать в запросе?

Добавлено через 12 минут
Попросил explain - абсолютно одинаковые отчеты для сортировки и без сортировки. Однако в апи до сортировки примари есть, а после сортировки - в сортире, то есть выходит куда-то.

Добавлено через 6 минут
В натуре это выглядит так. Выбрали таблицу - все ок. Стобцы примарей скрыты. Нажали на заголовок столбца чтобы сортировать - чпок и таблица расширилась на все примари которые в ней оказались, потому что они уже не примари. Но главное что редактировать таблицу после этого уже невозможно в той модели которая выбрана для редактирования. То есть на примарях конкретно. Ну, конечно, можно зафигачить в условие все поля и все значения.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
17.08.2013, 20:09
Цитата Сообщение от sqlnub Посмотреть сообщение
Ничего не понял. Для тех у кого на чердаке порядок вопрос:

свойства поля могут поменяться в результате сортировки полей?

Добавлено через 56 секунд
И почему чего нельзя использовать в запросе?
Отдельно мухи, отдельно котлеты.

Есть поля базы
Есть индексы
Поля базы могут быть указаны в индексах, причем одно поле может быть указано в разных индексах.
Пример:
MySQL
1
2
3
4
5
6
7
8
9
10
CREATE TABLE `c_news_categories` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) collate utf8_slovenian_ci NOT NULL,
  `parent_id` int(11) default NULL,
  `sub_parent_id` int(11) default NULL,
  `order_num` int(11) default NULL,
  `deleted` tinyint(1) default '0',
  PRIMARY KEY  (`id`),
  UNIQUE KEY(`parent_id`,`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_slovenian_ci CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=59 ;
Внимание, вопрос: Какое "свойство" у поля parent_id? Какое у id?
Ответ:
parent_id: INT(11) DEFAULT NULL
id: INT(11) NOT NULL AUTO_INCREMENT
Цитата Сообщение от sqlnub Посмотреть сообщение
Попросил explain - абсолютно одинаковые отчеты для сортировки и без сортировки. Однако в апи до сортировки примари есть, а после сортировки - в сортире, то есть выходит куда-то.
Без указания сортировки - MySQL выдает строки в произвольном порядке. Ему удобнее выдавать их в порядке кластерного индекса, но это не означает, что так будет всегда. Например, при параллелельной обработке запроса на нескольких процессорах первой в итог будет добавлена порция данных, полученная от наиболее быстро завершившего обработку задания процессора.
Напротив, при указании ORDER BY сервер обязан предоставить данные в затребованном порядке. В этом случае он первым делом проверит, нет ли индекса, обеспечивающего заданный порядок. При наличии индекса сортировка не требуется, и в итог сразу будут включены записи в требуемом порядке

Если подходящего индекса нет - сервер вынужден выполнить операцию сортировки.

Но вы и тут извратили ситуацию, заставив сервер сортировать по отсутствующему в итоговой выборке полю. Поэтому, скорее всего, оптимизатор просто проигнорировал (вполне справедливо) требование на сортировку, и предоставил данные в хаотичном порядке.

Учите азы, легче будет понимать и управлять процессами, происходящими при компиляции и выполнении SQL-запросов
0
Заблокирован
17.08.2013, 20:58  [ТС]
Придется и мне сказать - бред нерелевантный. Во-первых у меня тотально все поля имеются, ну вот сейчас 17 штук из 3 таблиц ни одного не пропущено и еще одно concat. Все поля с уникальными псевдонимами. Следовательно у меня такое не должно было повториться согласно вашей "теории". Однако повторяется в точности. До сортировки все 3 pri - PRI, а после - шиш.

Ну раз пошла такая пьянка и я налью.

PRIMARY KEY (`id`),
UNIQUE KEY(`parent_id`,`id`)

Что ^^^ это значит? primary это и есть unique только not null и его имя всегда PRIMARY. Даже если вы не напишите not null - мотор это сделат за вас. Тавтология детектет.

Цитата Сообщение от cygapb-007 Посмотреть сообщение
Внимание, вопрос: Какое "свойство" у поля parent_id? Какое у id?
Ответ:
parent_id: INT(11) DEFAULT NULL
id: INT(11) NOT NULL AUTO_INCREMENT
Неправильный ответ, у id будет PRI, а у parent_id - MUL. Потому что вы два поля туда зафигачили и получили тн композитный индекс.

Короче, индексы и ключи не могут слетать от сортировки и тем более от какой-то там выборки полей. Если поле не выбрано, ежу понятно по нему и не отсортируешь. Ну, то есть в запросе можно написать что угодно, но я про интерфейсы. У меня все поля есть.

И вообще почему я должен обсуждать ваши баги, когда у меня работа стоит. Теперь надо решать или брать все из информационной схемы - ну толку-то с одного примари, там же не только он слетает, еще пара-тройка битов отскакивает - либо как-то чинить этот mysqli.

Добавлено через 10 минут
Без сортировки
49667 1100001000000011

После сортировки
32769 1000000000000001

Попробуйте объяснить в рамках своей собственной теории куда делись целых три бита?

Насколько моя теория подсказывает - все что я назначил полю - все должно оставаться при нем как те самые свойства объекта. Использует мотор индексы или нет - меня это ниразу неколебет. Я хочу найти свое поле по первичному ключу который я сам повесил и если не могу - значит это баг.

Для тех кто идентифицирует поля по именам это все равно что после сортировки бы имя поменялось. И ксати, оно тоже меняется. Я выше отметил.

Короче глюконат этот ваш бесплатный майскуль. Уж насколько дурацким был адодб, но там и близко такого не было.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
17.08.2013, 21:00
Пилите, Шура, пилите... Не отвлекайтесь...

Не для подначить, но пользы для: 13.1.17. CREATE TABLE Syntax
Цитата Сообщение от http://dev.mysql.com/doc/refman/5.6/en/create-table.html
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
create_definition:
    col_name column_definition
  | [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
      [index_option] ...
  | {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
      [index_name] [index_type] (index_col_name,...)
      [index_option] ...
  | {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)
      [index_option] ...
  | [CONSTRAINT [symbol]] FOREIGN KEY
      [index_name] (index_col_name,...) reference_definition
  | CHECK (expr)
0
Заблокирован
17.08.2013, 21:01  [ТС]
Слив защитан. Пошел писать свой fetch_field.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
17.08.2013, 21:04
Цитата Сообщение от sqlnub Посмотреть сообщение
Слив защитан. Пошел писать свой fetch_field.
Не надо столь ярко демонстрировать уровень своего развития. Привыкли к терминам "слив" - идите на форумы по обсуждению сантехники
0
Заблокирован
17.08.2013, 21:12  [ТС]
Впрочем, я раньше всегда юзал атрибут автоикремента, но тут подумал вдруг мне захочется что-то еще уникально подсчитать и поэтому добавил к его биту бит примари.

Code
1
define ('TB_KEY_FIELD', MYSQLI_AUTO_INCREMENT_FLAG | MYSQLI_PRI_KEY_FLAG);
Может быть проще будет не хотеть что-то еще подсчитать автоматически кроме индексов. С другой стороны портятся еще данные. Например то самое поле concat согласно документации обязано быть оригинально именем функции, а я имею - пусто. Ну ладно, но после сортировки вместо пусто внезапно там появляется алиас.

Может быть и это объясняется цитатой create table с мануала?

Добавлено через 5 минут
Цитата Сообщение от cygapb-007 Посмотреть сообщение
Не надо столь ярко демонстрировать уровень своего развития.
После вашей демонстрации моя просто меркнет. Я уже третий день ищу ответ как на халяву получить обратно сведения которые я внес в БД, а имею одно только г. На переполненном стеке такой же умнег процитировал что-то насчет версии сервера, я ему процитировал версию, он процитированное свое удалил.

Проблема в том что никому этот fetch_field не стучит. Его вообще почти не юзают и кроме цитат с зенда о значении ключей ничего в каментах на пхп нет нету.

Ну вот вам когда в последний раз надобились данные о полях? Вы ж и так знаете какое где и по имени впишите в апликуху id=. Я такого не могу - определенно я знаю только имя БД. Все остальное заранее неизвестно и может быть получено только из самой БД. Если я оттуда что-то не могу получить - значит оно остается неизвестным. Работе капец.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
17.08.2013, 21:12
не интересен.
пилите свои такие разные гири самостоятельно
0
Заблокирован
17.08.2013, 21:14  [ТС]
Это надо было сделать с самого начала - пройти мимо не интересного вопроса если нечего ответить по существу. Но мы же мимо тещиного дома...
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
17.08.2013, 21:33
Уточню: гирю PHP не надо пилить одновременно с гирей MySQL
Стоните где-нибудь в другом месте
0
Заблокирован
17.08.2013, 21:46  [ТС]
Вы не знали ответа на вопрос и все равно влезли. Это баг и этот факт отражен в статье по линку. Но вот почему этот баг до сих пор проявляется я могу объяснить только тем, что свойствами поля большинство не пользуется, а те кто пользуются не пользуются mysqli.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
17.08.2013, 21:54
Вы знали, что вопрос по PHP, но тем не менее влезли в форум по MySQL.

В терминах MySQL я попытался объяснить вам, что MySQL возвращает разные наборы данных при указании ORDER BY и без оного. Соответственно описания полей возвращаемого набора данных - тоже разные

Однако вы по-прежнему считаете, что PHP должен директивно указать серверу MySQL, какого результата вы (не PHP и не MySQL) ждете от MySQL в рамках вашего мироощущения.

Пилите ваши гири дальше, не отвлекайтесь на трёп, отрывающий от остановившейся работы.
0
Заблокирован
17.08.2013, 22:01  [ТС]
Так я и говорю что это баг оптимизатора. Данные берутся не из базы, а из каких-то его глюкавых умозаключений. Типа чтобы побыстрее отдать. Ну вот, теперь мне побыстрее пришлось лезть в информационню схему и оттуда брать данные о примари для поля.

Еще раз. Следуя вашей логике могут и имена поле поменяться. А что такого - подумал оптимизатор и выдал вам вместо Диссертация - Диссер. И так, типа, понятно. Enjoy.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
17.08.2013, 22:11
Цитата Сообщение от sqlnub Посмотреть сообщение
Так я и говорю что это баг оптимизатора. Данные берутся не из базы, а из каких-то его глюкавых умозаключений. Типа чтобы побыстрее отдать. Ну вот, теперь мне побыстрее пришлось лезть в информационню схему и оттуда брать данные о примари для поля.

Еще раз. Следуя вашей логике могут и имена поле поменяться. А что такого - подумал оптимизатор и выдал вам вместо Диссертация - Диссер. И так, типа, понятно. Enjoy.
Это не баг оптимизатора. Это баг вашего представления о том, что должен вернуть MySQL в результате выполнения измененного запроса. То есть вы попытались навязать серверу свою точку зрения, не получилось - и вы объявили это багом MySQL

аве, Наполеон, соседи по палате ждут вас!

PS про изменение имен полей вы усердно твердите, но нигде не приводите ни одного конкретного примера того самого "произвольного" изменения имен полей сервером.
"Ты видишь суслика? А он - есть!" (С)
0
Заблокирован
17.08.2013, 23:37  [ТС]
Ну что, придется все-таки писать свой fetch_field

Вот я цитировал полученные данные:

Цитата Сообщение от sqlnub Посмотреть сообщение
Без сортировки
49667 1100001000000011

После сортировки
32769 1000000000000001
Не только бит примари пропал. Еще целых три. И самая мякотка в том, что пропал и бит автоинкремента - 512.

Может оппонент теперь доказать что и автоинкремент пропадает из-за сортировки потому что выборка и бла-бла-бла, или все-таки признает хотя бы факультативно свой бред.

Я просто уже одурел от глюков майскуля, честно говоря.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
18.08.2013, 00:02


пилите, Шура, они золотые...
0
Заблокирован
18.08.2013, 00:19  [ТС]
Цитата Сообщение от cygapb-007 Посмотреть сообщение
PS про изменение имен полей вы усердно твердите, но нигде не приводите ни одного конкретного примера того самого "произвольного" изменения имен полей сервером.
"Ты видишь суслика? А он - есть!" (С)
PHP
1
2
3
4
        if (strlen($finfo->orgname) == 0) {
            $finfo->orgname = 0; 
            $finfo->orgtable = 0; 
...
Поэтому получается id такое, до сортировки

HTML5
1
<th id="0[0][1][253]"
После такое

HTML5
1
<th id="[Фотка][1][253]"
"Фотка" это алиас concat() двух полей.

Согласно мануалу в первом случае я должен получить типа concat, и во втором concat.

Азы или буки будем поднимать?

Добавлено через 10 минут
Нормальный id должен быть таким и он такой для всех остальных полей:

Таблица[Поле][Флаги][Тип]

orgtable на concat не приходит, а orgname после сортира заменяется алиасом.
0
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
18.08.2013, 00:29


Ну и при чем тут MySQL?

Пилите, но уже без меня. Холистичность для меня важнее вашего мироощущения. Все золото что напилите - ваше, и только ваше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.08.2013, 00:29
Помогаю со студенческими работами здесь

PRIMARY KEY and UNIQUE KEY
Добрый день. mysql не создаёт таблицы в БД, код написан под старую версию mysql выбивает ошибку All parts of a PRIMARY KEY must...

PRIMARY KEY
приветствую. У меня есть таблица с 6 полями, 1 из которых primary key. одна из обязательных функций моей программы это регулярное...

Primary key
подскажите, имеется таблица, забитая данными, все колонки null. как объявить primary key, просто выдает ведь ошибку для null значения. и...

PRIMARY KEY
Чем отличаются следующие команды? CREATE TABLE T (P INTEGER NOT NULL, L INTEGER NOT NULL, A INTEGER NOT NULL, PRIMARY KEY (P ASC, L ASC,...

Serial Primary key
Народ, как объяснить преподу более грамотно, что такое serial ? и нафига он нужен? (ID_adress serial primary key,);


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru