2012-01-22 3 views
1

Я думаю, что у большинства людей были серьезные проблемы с введением значения/данных в базу данных (mysql). Когда я вставляю значение в базу данных, я назначаю уникальный идентификатор (INT) для этой строки. Когда я запрашиваю базу данных, я могу читать/изменять/удалять эту строку.Структура базы данных mysql (уникальный идентификатор)

С функцией for() (в php), я легко могу считывать значения/данные из базы данных. Проблема возникает, когда я удаляю строку (например, в середине).

Например:

БД:

ID | column1 | column2 | ... | columnN 
-------------------------------------- 
1 | abcdefgh | asdasda | ... | asdasdN 
2 | asdasddd | asdasda | ... | asdasdN 
... 
N | asdewfew | asddsad | ... | asddsaN 

PHP:

for($i = 0; $i <= $n; $i++){ 
    $sql = mysql_query("SELECT * FROM db WHERE ID = '$i' "); 
    //Code; 
} 

* $ п = последнее значение столбца из ID


Am Мне нужно реорганизовать всей базы данных, чтобы иметь правильную "f низкий "(1, 2, 3, .. n)? Или мне нужно ОБНОВИТЬ каждую ячейку?

+0

ваш $ я переменная, начиная с нуля, так что, во-первых выполнения этой команды: 'SEELCT * FROM дб ГДЕ ID = 0'. CAn вы пытаетесь с этим для цикла: 'for ($ i = 1; $ i <$ n + 1; $ i ++)' – Eray

+4

Вы не должны повторно запрашивать базу данных внутри цикла, если знаете фиксированные идентификаторы, которые вам нужно получить вперёд времени, поскольку это создает значительные накладные расходы для вашего скрипта. Вместо этого запросите базу данных один раз, чтобы получить все результаты и выполнить цикл по набору результатов. – rdlowrey

+0

Расширение mysql устарело и на пути к устареванию. Новый код должен использовать mysqli или PDO, оба из которых имеют важные преимущества, такие как поддержка подготовленных операторов. – outis

ответ

2

Что вы делаете здесь является ненужно благодаря AUTO_INCREMENT в mysql.Выполните эту команду из PhpMyAdmin (или другой системы управления БД):

ALTER TABLE db MODIFY COLUMN ID INT NOT NULL AUTO_INCREMENT; 

Теперь, когда вставка строки в db MySQL присвоит идентификатор для вас:

INSERT INTO db (id, column1, column2) VALUES(NULL, 'abc', 'def'); 

SELECT * FROM db;:

+--+-------+-------+ 
|id|column1|column2| 
+--+-------+-------+ 
|1 |old |oldrow | 
+--+-------+-------+ 
|2 |abc |def | <--- Your newly inserted row, with unique ID 
+--+-------+-------+ 

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


Кроме того, если вам нужно, чтобы захватить группу идентификаторов (хранится в массиве, например), это гораздо более эффективно выполнить один запрос с IN заявлением.

$ids = array(1,2,3,4,5,6); 
$in = implode(',', $ids); 
mysql_query('SELECT * FROM db WHERE id IN ('.$in.')'); 

Однако, если вы хотите, чтобы все строки просто использовать:

SELECT * FROM dbs; 

Но ненаскучил bobby tables.

1

Вы можете выбрать все строки с запросом

SELECT * FROM db 

и делать все, что вы хотите после

0

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

BTW, посмотрите на mysql_fetch_array(), это облегчит загрузку на сервере SQL.

+1

'mysql_fetch_array()' не имеет ничего общего с «load» – zerkms

+0

1 запрос с помощью fetch_array для обработки данных намного легче X-запроса. Так что да, в этом случае он имеет отношение к «нагрузке» – creack

+0

, он все еще не имеет. Вы можете использовать 'mysql_fetch_assoc' вместо этого с теми же« нагрузками »причин lol – zerkms

1

Вы можете never обеспечить, чтобы идентификаторы были непрерывными. Как вы заметили себя, есть пробелы после удаления строки, но даже, например, когда вы вставляете строки в транзакцию и не совершаете ее, потому что что-то не удалось, и вам нужно вернуть транзакцию. Идентификатор - это идентификатор, а не номер строки.

Например, если вы хотите, чтобы выбрать X элементы из где-то (или таких) посмотреть на LIMIT и OFFSET

SELECT * FROM mytable ORDER BY created DESC LIMIT 10 OFFSET 20; 

Это выбирает строки 21 до 30 заказанных времени их создания. Обратите внимание, что я не использую id для заказа, но вы не можете положиться на него (как упоминалось).

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

SELECT * FROM mytable WHERE id IN (1,2,3,4); 

Но не думайте, что вы всегда будете получать 4 строки.

+0

' ORDER BY' идет перед 'LIMIT' – zerkms

+0

Я добавил' ORDER BY' позже, таким образом, он поменяется местами. Благодарю. – KingCrunch

0

Если вам нужны все строки и все столбцы для такого использования таблицы:

$query = mysql_query("SELECT * FROM table_name"); 

и затем цикл по каждой строке с Оператор While:

while ($row = mysql_fetch_array($query)) 
{ 
     echo $row['column_name']; 
} 
1

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

Если вам нужен определенный диапазон строк из таблицы, используйте BETWEEN, чтобы указать их в запросе:

SELECT id, col1, col2, ..., coln 
    FROM `table` 
    WHERE id BETWEEN ? AND ? 
    ORDER BY id 
Смежные вопросы