![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
Volter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 16.4.2007 Репутация: нет Всего: нет |
Добрый день,
Задача: Есть таблица с данными: tbNum +----+ | id | +----+ | 1 | | 2 | | 4 | | 5 | | 6 | | 7 | +----+ id - ПЕРВИЧНЫЙ КЛЮЧ (т.е. Циферки которые лежат в данной таблице неповторяющиеся ) Уникальные) Как видим в таблице есть числа, НО эти числа идут не по-порядку, ПРОПУЩЕНО ЧИСЛО 3 !!! Другими словами число 3 в данной таблице есть минимальное свободное число! ТЕПЕРЬ ВОПРОС! Как сформировать правильно запрос в MySQL чтобы получить такое минимальное свободное число? Заранее, всех благодарю! |
|||
|
||||
skyboy |
|
||||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
и что? если id - первичный ключ, то это вполне нормально. зачем тебе туда чего-то вставлять? Добавлено через 5 минут и 59 секунд так уж и быть, вот запрос:
Добавлено через 7 минут и 4 секунды но если ты планируешь после удаления записей забивать вновь добавляемые с коррекцией значения id, то я хочу тебе сказать: так делать нельзя. заимеешь проблем. |
||||
|
|||||
Volter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 16.4.2007 Репутация: нет Всего: нет |
К сожалению, пример не работает
![]() |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
да. "+1" было лишним.
Добавлено через 31 секунду работает. но неверно. |
|||
|
||||
Volter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 16.4.2007 Репутация: нет Всего: нет |
Мой дорогой друг, вы для какой версии MySQL пишете этот код?
|
|||
|
||||
muzer |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 31.8.2006 Репутация: 30 Всего: 31 |
В случае когда пропусков нет вернётся максимальный id + 1. |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
Volter, версия 5.1.19 или 5.2, вроде бы как(посмотрю завтра - код писал на работе)
А что, разве существуют другие версии? ![]() ![]() Добавлено через 1 минуту и 59 секунд muzer, лаконичнее и без подзапросов ![]() ![]() |
|||
|
||||
Volter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 16.4.2007 Репутация: нет Всего: нет |
БЛАГОДАРЮ muzer и skyboy за содействия!
![]() Это сообщение отредактировал(а) Volter - 17.4.2007, 01:39 |
|||
|
||||
Volter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 16.4.2007 Репутация: нет Всего: нет |
Товарищи!
Вопрос не до конца вообщето решили мы ![]() Допустим, у нас есть таже таблица, но с другой последовательностью данных: tbNum +----+ | id | +----+ | 3 | | 5 | +----+ По сути, запрос должен вернуть число 0, а не число 4, как возвращает данный код:
Что нужно приписать еще в SQL-запросе чтобы полностью удовлетворять данную проблемку? ![]() |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
Добавлено через 1 минуту и 46 секунд мой запрос должен идти после первого запроса(оператор union используется). Вместо UNION лучше даже использовать UNION ALL Добавлено через 2 минуты и 30 секунд Volter, открой страную тайну: на кой ляд тебе шаманство с primary key? |
|||
|
||||
Volter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 16.4.2007 Репутация: нет Всего: нет |
SkyBoy, Я вот рылся рылся в книге Полья Дюбуа "MySQL The definitive guide to using, programming, and administering MySQL databases", и не нашел грамотного AUTO_INCREMENT. В том смысле что этот AUTO_INCREMENT при добавлении строки просто в тупую увеличивает число не анализируя содержимое того атрибута к которому оно было присвоено. Т.е. Будет набор такой: tbNum +----+ | id | +----+ | 3 | | 5 | +----+ При добавлении новой записи в таблицу, параметр AUTO_INCREMENT создаст число 6, но разве это рационально, в том смысле что есть пустующие строки 0,1,2,4? И еще один небольшой вопрос, можно ли при создании таблицы прописать какой либо код в атрибут? т.е. создать код который автоматически при добавлении записи в таблицу, находит минимальное свободное число в данном атрибуте и присваивает его. Заранее благодарю, skyboy |
|||
|
||||
Volter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 16.4.2007 Репутация: нет Всего: нет |
Да и вот еще кое чего:
Вот запрос на существовании данных в табличке. mysql> SELECT * FROM tbNum; +----+ | id | +----+ | 3 | | 5 | +----+ 2 rows in set (0.00 sec) А вот тот самый запрос, который непашет почемуто. ![]() mysql> SELECT t0.id,(temp.min_id-t0.id) difference -> FROM tbNum t0 -> INNER JOIN -> ( -> SELECT t1.id as id,min(t2.id) as min_id -> FROM tbNum t1 -> CROSS JOIN tbNum t2 -> WHERE t2.id> t1.id -> GROUP BY t1.id -> ) temp -> ON temp.id = t0.id -> WHERE temp.min_id- t0.id>0; ERROR 1064: You have an error in your SQL syntax. Check the manual that corresp onds to your MySQL server version for the right syntax to use near 'SELECT t1.id as id,min(t2.id) as min_id FROM |
|||
|
||||
skyboy |
|
||||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
а потому что подзапросы появились не сразу. Далеко не сразу. А версию используемого сервера ты так и не назвал, так что выводы не из чего делать. Надеюсь - пока что.
Но ведь строки сами по себе никуда не ушли?! Их удалили. А если на них(на записи в этих "строках") ссылались другие таблицы, то что лучше - пусть ссылаются на несуществующие данные и, скажем, inner join такие ситуации скроет, а left join отобразит, или лучше создать "в том месте" записи, никакого отношения к связанным данным не имеющие? Именно в виду такой политики безопасности, фраза
с приведенным примером не совсем верна. AUTO_INC отталкивается не от последнего значения в поле таблицы, а от "внутренного" счетчика, связанного с таблицей - благодаря этому после любого добавления/удаления строк, на вновь добавляемую строку(как на значение ключа) друие таблицы в принципе ссылаться не могут, потому как значение автоинкрементного поля во вновь создаваемой записи уникально. И мой тебе совет: не надо "переть" против этого механизма. Заимеешь скрытых граблей, а выиграть - и в чем не выиграешь. Ни в скорости(ключам на собственно значения плевать), ни в объеме(тип данных тот же - места занимают столько же). Есть такая вещь, как триггеры. В MySQL появились только в 5-й версии. |
||||
|
|||||
Volter |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 16.4.2007 Репутация: нет Всего: нет |
НебесномуМальчику мои особые благодарности, сразу видно начитанный в данной области человек, не то что некоторые на форумах!
SkyBoy, у меня к тебе несколько вопросов, ты уж извини я только начал изучение, а ты я гляжу уже давно знаком с SQL, если не откажеш, ответь:
Это сообщение отредактировал(а) Volter - 17.4.2007, 22:54 |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 41 Всего: 260 |
не надо искажать мой ник. и переводить не надо. всю поэзию убил переводом ![]() доводилось плотно работать и рассматривать вблизи. "Жить захочешь - не так раскорячишься"(С) "Особенности национальной охоты" К твоему сожалению, я вполне обходился в работе английской версией мануала на dev.mysql.com: MySQL 5.0 Reference Manual и локальной версией справки, идущей в комплекте в дистрибутиве mysql(если только не заимел "обрезку" какую вроде как в Денвере) вот полный список манов для разных версий(заметь, что для <5 версий есть и русская версия) |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MySQL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |