Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Заполнение ранее удалённых id / 25 сообщений из 40, страница 1 из 2
29.09.2009, 16:23
    #36223153
telal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
Подскажите, пожалуйста, как реализовать

Задачка следующая:

Был список 100 позиций, т.е. с первого по сотый номера заняты.
Потом удалили с десятого по двадцатый. И эти номера освободились.
Далее при добавлении нумерация продолжится 101,102,103 и т.д.

Требуется заполнить номера с 10 по 20.
...
Рейтинг: 0 / 0
29.09.2009, 16:44
    #36223234
phpTeach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
1) Делаешь запрос SELECT id FROM table where id BETWEEN 10 AND 20
2) Смотришь, если ли записи
3) Если есть, берешь первый выбранный id
4) Состовляешь INSERT, если был найден id из пункта 3 то принудительно вставляешь его в запрос INSERT, если нет то как обычно NULL вместо id

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
$query  = 'SELECT id FROM table1 where id BETWEEN 10 AND 20';
$result = mysql_query($query);
if (mysql_num_rows($result) >  0 ) {
	$row = mysql_fetch_row($result);
	$id  = $row['id'];
} else {
	$id = 'NULL';
}
$query = 'INSERT INTO table2(id, col1, coll2) VALUES(' . $id . ', "aaa", "bbb")';
mysql_query($query);
...
Рейтинг: 0 / 0
29.09.2009, 16:46
    #36223243
phpTeach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
table1 и table2 не нужно, это всё одна табличка, ошибся случаем
...
Рейтинг: 0 / 0
29.09.2009, 16:46
    #36223247
telal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
phpTeach,

это просто а как быть, если интервал не известен? это я для примера привёл 10 и 20
...
Рейтинг: 0 / 0
29.09.2009, 17:05
    #36223348
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
telalТребуется заполнить номера ...Предлагаю не заниматься такой ерундой.
Желание делать это с большой вероятностью говорит либо о неправильном проектировании БД, либо о неправильном проектировании всей разрабатываемой системы.

Если вы все-таки настаиваете, то учтите, что, на мой взгляд, не существует надежного способа занятия пропущенных номеров без блокировки всей таблицы, что не может не сказаться на производительности.
...
Рейтинг: 0 / 0
29.09.2009, 17:06
    #36223351
javasoft
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
telalphpTeach,

это просто а как быть, если интервал не известен? это я для примера привёл 10 и 20

Извините, а смысл таких манипуляций в чем заключается?
...
Рейтинг: 0 / 0
29.09.2009, 17:15
    #36223379
phpTeach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
Я тоже не вижу смысла в данной манипуляции, но по вопросу о неизвестности интервала могу предположить, что при удалении вы всё же можете сохранять информацию о id которых удаляете
...
Рейтинг: 0 / 0
29.09.2009, 17:42
    #36223447
alecsey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
кстати пока читал в голове возник вопрос не подскажите как организовать Pivot в mysql? аналог ораклового
select level rn from dual connect by level <= 10
...
Рейтинг: 0 / 0
29.09.2009, 17:47
    #36223459
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
alecseyкстати пока читал в голове возник вопрос не подскажите как организовать Pivot в mysql? аналог ораклового
Код: plaintext
select level rn from dual connect by level <=  10 
Прямого эквивалента нет, ибо в MySQL нет иерархических запросов.
Но повторить результат можно с помощью переменных и большой таблицы.
...
Рейтинг: 0 / 0
29.09.2009, 17:49
    #36223465
telal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
javasoft,

Это желание заказчика. Все id из таблицы выводятся в графическое отображение. Соответственно, он эти id использует для поиска. Он хочет, чтобы не было пробелов среди номеров этой таблицы. Ложные номера по порядку я не вижу смысла отображать, так как говорил ранее, они используются для поиска
...
Рейтинг: 0 / 0
29.09.2009, 17:52
    #36223472
telal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
phpTeach,

я думал, что это можно сделать sql. Но по всей видимости буду использовать возможности языка программирования
...
Рейтинг: 0 / 0
29.09.2009, 17:58
    #36223496
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
telalя думал, что это можно сделать sql.Да сделать-то можно. Но не нужно навешивать на суррогатный первичный ключ функциональность, ему несвойственную.
...
Рейтинг: 0 / 0
29.09.2009, 17:59
    #36223500
alecsey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
miksoftНо повторить результат можно с помощью переменных и большой таблицы.эт понятно =) я думал малоли
...
Рейтинг: 0 / 0
29.09.2009, 18:16
    #36223545
phpTeach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
telaljavasoft,

Все id из таблицы выводятся в графическое отображение. Соответственно, он эти id использует для поиска. Он хочет, чтобы не было пробелов среди номеров этой таблицы. Ложные номера по порядку я не вижу смысла отображать, так как говорил ранее, они используются для поиска

Строки номеруй не зависимо от id, а по порядку, ну а если надо редактировать или вывести информацию конкретного пользователя из интерфейса давай ссылку соответственно в виде ?user_id={Идентификатор}
...
Рейтинг: 0 / 0
29.09.2009, 19:02
    #36223639
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
phpTeach,
Строки номеруй не зависимо от id, а по порядку по какому порядку? если кто не в курсе - в sql нет понятия "номер строки".
Можно, конечно, добавить поле "типа_номер" в таблицу и сделать апдейт (переменными), чтобы новые номера по порядку первичного ключа встали. А потом повесить триггеры на добавление и удаление записей, как-то запретить изменение этого поля... Действительно, telal , оно Вам надо? Впрочем, если заказчик в данном случае ещё и хочет искать по id... то он маньяк. Вы спросите, что он захочет увидеть, когда САМ удалит чего-нибудь из "середины" списка?
...
Рейтинг: 0 / 0
29.09.2009, 19:17
    #36223664
phpTeach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
tanglir, ORDER BY id и будет тебе номер строки
...
Рейтинг: 0 / 0
29.09.2009, 19:28
    #36223683
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
phpTeach,

откуда он будет, если ид-шек с 10 по 20ю нет? Выведешь ты список с "нумерацией"(ну на клиенте в датасете посчитаешь номер строки, например), а потом заказчик возьмёт и удалит с третьей по восьмую. Выведешь список заново, но под старыми номерами будут лежать другие данные . Кто виноват? Номера-то нужны без разрывов - читаем посты ТС выше!
PS. И вообще, спор "ниачём": если заказчик принципиально настаивает на своём бзике - сделать, разъяснив последствия и потребовав письменного подтверджения, что он понял, что может произойти
...
Рейтинг: 0 / 0
29.09.2009, 20:07
    #36223731
phpTeach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
tanglir, Номер строки и идентификатор пользователя разные сущности
...
Рейтинг: 0 / 0
29.09.2009, 21:11
    #36223776
telal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
Спасибо большое за рассуждения, но кто-нибудь может резюмировать всё изложенное?
...
Рейтинг: 0 / 0
29.09.2009, 21:15
    #36223783
phpTeach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
Ты еще раз объясни подробнее, для чего тебе нужно чтобы id шли последовательно?
...
Рейтинг: 0 / 0
29.09.2009, 21:27
    #36223794
phpTeach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
Это желание заказчика. Все id из таблицы выводятся в графическое отображение. Соответственно, он эти id использует для поиска. Он хочет, чтобы не было пробелов среди номеров этой таблицы. Ложные номера по порядку я не вижу смысла отображать, так как говорил ранее, они используются для поиска

1) Ты пишешь что в номерах не должно быть пробелов, но после удаления пробелы все равно будут пока не заполнятся
2) Как ты хочешь чтобы заполнялись пробелы после удаления, сново добавляемыми записями или последние старые записи хочешь чтобы переместились на пробелы
...
Рейтинг: 0 / 0
29.09.2009, 21:40
    #36223807
phpTeach
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
Я бы сделал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
$query  = 'SELECT * FROM table ORDER BY id';
$result = mysql_query($query);
$i      =  1 ;
while ($row = mysql_fetch_row($result)) {
	echo $i++ . ' | <a href="/?id= ' . $row['id'] . '">' . $row['name'] . '</a> | ' . $row['id'] . '<br>'; 
}
Т.е при клике на ссылку ты будешь выводить инфу о нужной записи, а если вручную хочешь писать id для поиска, то вбиваем id, который в моем примере выводится последнем значением. Идентифицировать запись по номеру строки не правильно!
Ведь вырвав страницу из блокнота ты же не будешь вставлять на место вырванных страниц новые
...
Рейтинг: 0 / 0
29.09.2009, 21:56
    #36223823
telal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
phpTeach,

Вы всё правильно перечислили.

нет смысла сдвигать id на пустые места, таблица может быть связана по этому ключу и может нарушиться целостность данных.
Думаю, нужно именно заполнять пропущенные id
...
Рейтинг: 0 / 0
29.09.2009, 21:58
    #36223825
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
telal,

1. категорически присоединяюсь к всем предыдушим орателям
на предмет не надо играться с ИД, не надо!, Фу, бяка, не трожь,
брось немедлено :-)))
Кто-нибудь увидит, в лучшем случае посмеются, в худшем случае
обругают матом

2. Желание клиента -- закон, он деньги платит, кушать всем хочется, что делать?
Елементарно: Создать дополнительное поле special_id, при инсертед записывать туда
ВСЕ что заблагорасудится заказчику, хоть день рождения его тещ.

3. найти пробел в списке:
/topic/585423
...
Рейтинг: 0 / 0
02.10.2009, 12:11
    #36229256
telal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Заполнение ранее удалённых id
Здравствуйте, я покопался в сети и наткнулся на запрос, который получает пропуски всех чисел в заданной последовательности, но проблемка, он написан на T-sql. Пожалуйста, помогите переработать его

declare @i int;

SELECT @i = MAX(pkid) FROM t1;

WITH tmp (gapId) AS (
SELECT DISTINCT a.pkid + 1
FROM t1 a
WHERE NOT EXISTS( SELECT * FROM t1 b
WHERE b.pkid = a.pkid + 1)
AND a.pkid < @i

UNION ALL

SELECT a.gapId + 1
FROM tmp a
WHERE NOT EXISTS( SELECT * FROM t1 b
WHERE b.pkid = a.gapId + 1)
AND a.gapId < @i
)
SELECT gapId
FROM tmp
ORDER BY gapId;

я так понимаю конструкции WITH ... AS в mysql нет
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Заполнение ранее удалённых id / 25 сообщений из 40, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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