Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
6 / 6 / 5
Регистрация: 16.01.2012
Сообщений: 245
1

обновить в базе id через php

28.08.2012, 22:34. Показов 3557. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть в базе колонка id где хранятся записи, но получается изначально была допустим 1 , 2, 3,4,5 и тд записи по порядку, теперь я удалил например 2 и 5, остаются 1,3,4. начинаю добавлять добавляется новая уже с id 6. Как обновить все записи и каждый раз чтобы если я и удаляю запись то id сам выстраивается друг за дружкой.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
$ob_id = mysql_query("SELECT id,date_add FROM comments3 ORDER BY date_add");
                $ob_id_1 = mysql_fetch_array($ob_id);
                do
                {
                $ob_id_2 = $ob_id_1['id'];
                $q = 0;
                $q = $q+1;
                $update_talon_reb = "UPDATE comments3 set id='$q' WHERE id='$ob_id_2'";
                mysql_query($update_talon_reb);
                
                }
                while($ob_id_1 = mysql_fetch_array($ob_id));
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2012, 22:34
Ответы с готовыми решениями:

Обновить дату в mysql через php
в базе есть таблица -- Структура таблицы `date_dafault` -- CREATE TABLE IF NOT EXISTS...

Создание таблицы в базе данных через php
Нужна помощь. Столкнулся с проблемой создания таблицы через PHP код, пытался найти ошибку но не...

Редактирование и удаление полей через php в базе данных
Здравствуйте, столкнулся с такой проблемой, что скрипт мой видит таблицу, правильно описывает...

Подсчёт определённых строк в базе и вывод их через php
Есть таблица "tblTalon", нужно сделать так чтобы php подсчитывал сколько всего сделано записей за...

10
67 / 60 / 25
Регистрация: 05.05.2009
Сообщений: 131
29.08.2012, 01:40 2
Судя по всему записи удаляются по одной. Тогда можно при каждом удалении сдвигать все записи, следующие за удалённой, на одну позицию вверх
PHP
1
$q = "UPDATE `table` SET `id`=`id`-1 WHERE `id`> ".$del_id;
и обновлять счётчик автоинкремента
PHP
1
$q = "ALTER TABLE `table` AUTO_INCREMENT =".($num_rows + 1);
1
6 / 6 / 5
Регистрация: 16.01.2012
Сообщений: 245
29.08.2012, 07:26  [ТС] 3
А если будет удалено не 1 а 1 раз 10 записей, другой 15 например. Сейчас вот например у меня 1 а потом 77 , 93, 103, 104 и тд. А нужно чтобы в базе comments3 все id каждый раз были по порядку. Как это сделать через запрос?
0
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
29.08.2012, 09:23 4
Способ 1: UPDATE ... ORDER BY `id` DESC
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# что в таблице было изначально
mysql> SELECT * FROM `test`;
+----+--------+------+
| id | name   | foo  |
+----+--------+------+
|  1 | first  |   42 |
|  2 | first  |   42 |
|  3 | second |   37 |
|  4 | lorem  |   10 |
|  5 | ipsum  |   20 |
|  6 | dolor  |   30 |
+----+--------+------+
6 rows in set (0.00 sec)
 
# удалили какие-то записи
mysql> DELETE FROM `test` WHERE `id` IN (2,3,6);
Query OK, 3 rows affected (0.10 sec)
 
# что осталось в таблице
mysql> SELECT * FROM `test`;
+----+-------+------+
| id | name  | foo  |
+----+-------+------+
|  1 | first |   42 |
|  4 | lorem |   10 |
|  5 | ipsum |   20 |
+----+-------+------+
3 rows in set (0.00 sec)
 
# создаём две вспомогательных переменных
# @count = COUNT(*)
# @i     = 0
mysql> SELECT COUNT(*), 0 INTO @count, @i FROM `test`;
Query OK, 1 row affected (0.00 sec)
 
# обновляем все `id` с конца во избежание ошибок дублирования `id`
mysql> UPDATE `test` SET `id` = @count - (@i := @i + 1) + 1 ORDER BY `id` DESC;
Query OK, 2 rows affected (0.06 sec)
Rows matched: 3  Changed: 2  Warnings: 0
 
# что получилось
mysql> SELECT * FROM `test`;
+----+-------+------+
| id | name  | foo  |
+----+-------+------+
|  1 | first |   42 |
|  2 | lorem |   10 |
|  3 | ipsum |   20 |
+----+-------+------+
3 rows in set (0.00 sec)
 
# осталось получить @count
SELECT @count;
 
# и с помощью ALTER TABLE изменить AUTO_INCREMENT, как уже писали выше
Способ 2: новая таблица.
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# что было в таблице
mysql> SELECT * FROM `test`;
+----+-------+------+
| id | name  | foo  |
+----+-------+------+
|  1 | first |   42 |
|  4 | lorem |   10 |
|  5 | ipsum |   20 |
+----+-------+------+
3 rows in set (0.00 sec)
 
# создаём новую пустую таблицу с такой же структурой
mysql> CREATE TABLE `test-new` LIKE `test`;
Query OK, 0 rows affected (0.11 sec)
 
# копируем все записи, но не указываем `id`, чтобы он генерировался сам
mysql> INSERT INTO `test-new` (`name`,`foo`) SELECT `name`,`foo` FROM `test` ORDER BY `id`;
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0
 
# переименовываем таблицы, подменяем старую на новую
mysql> RENAME TABLE `test` TO `test-old`, `test-new` TO `test`;
Query OK, 0 rows affected (0.08 sec)
 
# старая больше не нужна
mysql> DROP TABLE `test-old`;
Query OK, 0 rows affected (0.07 sec)
 
# что получилось
mysql> SELECT * FROM `test`;
+----+-------+------+
| id | name  | foo  |
+----+-------+------+
|  1 | first |   42 |
|  2 | lorem |   10 |
|  3 | ipsum |   20 |
+----+-------+------+
3 rows in set (0.00 sec)
Добавлено через 1 минуту
А вообще, если мы допускаем подобное перестраивание ID, значит они ни для чего не используются, значит они не нужны, значит `id` можно удалить из таблицы.

Добавлено через 1 час 29 минут
Цитата Сообщение от Vovan-VE Посмотреть сообщение
MySQL
30
31
32
33
34
35
36
37
38
# создаём две вспомогательных переменных
# @count = COUNT(*)
# @i = 0
mysql> SELECT COUNT(*), 0 INTO @count, @i FROM `test`;
Query OK, 1 row affected (0.00 sec)
# обновляем все `id` с конца во избежание ошибок дублирования `id`
mysql> UPDATE `test` SET `id` = @count - (@i := @i + 1) + 1 ORDER BY `id` DESC;
Query OK, 2 rows affected (0.06 sec)
Rows matched: 3 Changed: 2 Warnings: 0
Бред написал. Надо ASC:
MySQL
30
31
SET @i = 0;
UPDATE `test` SET `id` = (@i := @i + 1) ORDER BY `id` ASC;
1
12 / 12 / 0
Регистрация: 23.12.2009
Сообщений: 149
29.08.2012, 10:51 5
а зачем это вообще нужно,ведь вы никак не сможете потом восстановить удаленные строки,если это вдруг потребуется...как бы оно не зря так придумано)
1
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
29.08.2012, 11:01 6
Ну к примеру если постраничная навигация сделана не по LIMIT а по остатку от деления id на число нужных записей)
тогда без этого не обойтись
1
13208 / 6596 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
29.08.2012, 11:01 7
Цитата Сообщение от proset Посмотреть сообщение
а зачем это вообще нужно
О том и речь. Зачем тогда вообще ID нужны? Где и как они используются (если вообще используются)?
1
12 / 12 / 0
Регистрация: 23.12.2009
Сообщений: 149
29.08.2012, 11:08 8
Цитата Сообщение от Vovan-VE Посмотреть сообщение
О том и речь. Зачем тогда вообще ID нужны? Где и как они используются (если вообще используются)?
короче говоря я так понял,что у человека есть таблица неважно с чем, в ней несколько записей n, скажем что n=20, он удаляет 20ю запись и записывает новую,по правилам составления таблиц она будет 21й,хотя 20й записи не существует == > порядок нарушается 18,19,21 это выглядит не красиво...
мб из этих соображений человек хочет их упорядочить?!просто как бы других вариантов я не вижу...и думаю делать это не стоит

Добавлено через 1 минуту
Цитата Сообщение от KOPOJI Посмотреть сообщение
Ну к примеру если постраничная навигация сделана не по LIMIT а по остатку от деления id на число нужных записей)
тогда без этого не обойтись
не наблюдал такого в своей практике честно говоря
1
KOPOJI
29.08.2012, 11:10
  #9

Не по теме:

Цитата Сообщение от proset Посмотреть сообщение
не наблюдал такого в своей практике честно говоря
я давно когда то так делал когда не знал о лимите :D

1
6 / 6 / 5
Регистрация: 16.01.2012
Сообщений: 245
29.08.2012, 12:08  [ТС] 10
На самом деле дело вот в чём, это система вопросов, то есть я пользователь зашёл на сайт мне пишет что я задаю например 15 вопрос (а это работает пока так, что я нахожу через запрос самый больший id и добавляю 1, получается фактически уже в базе 14 записей + 1 и получается что задаю 15 вопрос.) Так вот я задал данный вопрос, потом они через админку попадают ко мне на проверку если написали чушь, то я его удаляю. А теперь если мне задали 3 вопроса, 15,16, и 17 например, я удаляю ток 16, и получается нумерация ведь пропадает. Правда каждый раз обновлять id тоже не вариант думаю. Может мне проще через count всё делать? Даже скорее всего так и проще, подсчитываю сколько задано вопросов добавляю 1 и вот следующий вопрос номер получается. (P.S. Я перемудрил со всем этим делом наверное изначально.)
0
12 / 12 / 0
Регистрация: 23.12.2009
Сообщений: 149
29.08.2012, 12:13 11
Цитата Сообщение от Dimka1judo Посмотреть сообщение
На самом деле дело вот в чём, это система вопросов, то есть я пользователь зашёл на сайт мне пишет что я задаю например 15 вопрос (а это работает пока так, что я нахожу через запрос самый больший id и добавляю 1, получается фактически уже в базе 14 записей + 1 и получается что задаю 15 вопрос.) Так вот я задал данный вопрос, потом они через админку попадают ко мне на проверку если написали чушь, то я его удаляю. А теперь если мне задали 3 вопроса, 15,16, и 17 например, я удаляю ток 16, и получается нумерация ведь пропадает. Правда каждый раз обновлять id тоже не вариант думаю. Может мне проще через count всё делать? Даже скорее всего так и проще, подсчитываю сколько задано вопросов добавляю 1 и вот следующий вопрос номер получается. (P.S. Я перемудрил со всем этим делом наверное изначально.)
в таблице создайте еще одно НЕ КЛЮЧЕВОЕ поле,назавите его idquestion его не надо автоинкрементировать и сами задайте этому полю id по порядку при добавлении новой строки припишите к этому полю значение +1 и в своих вычислениях исполюзуйте не поле id а idquestion
0
29.08.2012, 12:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.08.2012, 12:13
Помогаю со студенческими работами здесь

никак не могу разобраться с поиском по базе через форму php
люди плиззз. я только учусь! никак не могу разобраться с поиском по базе через форму php. пишу...

Замена информации в базе данных MySQL со страницы пользователя через PHP
Помогите пожалуйста!!! Не знаю как решить проблему. Делаю мини форум и на странице пользователя...

Доступ к базе данных на базе хранимых процедур MySQL из php
Добрый день возник вопрос по доступ к базе данных на базе хранимых процедур MySQL из php Из файла...

Как обновить php 5.3.29 до php 5.6 на openserver?
Долго я мучился с денвером и решил поставить openserver чтобы обновить php. Но и тут я не могу...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru