|
|
|
| Например есть таблица List
id (уникальный ключ) и name
Пусть мы всатвили три записи:
insert into List values ('','Text1');
insert into List values ('','Text2');
insert into List values ('','Text3');
|
Для первой записи id=1, для второй id=2, для третьей id=3.
Удаляем записи 2 и 3:
delete from List * where id > 1;
|
Далее всатвляем запись:
insert into List values ('','Text4');
|
Я думал, что id=2, но нет, id=4.
Как сделать так, чтобы id шли по порядку? Ведь если из 100 записей 99 удалили и потом добавили новую, то id=101. | |
|
|
|
|
|
|
|
для: Andron
(15.07.2004 в 20:36)
| | Ага, т.е. первичный ключ имеет атрибут AUTO_INCREMENT. Вообще-то фичу, которую вы описали специально создали в новой таблице MySQL MyISAM, раньше когда MySQL поддерживала только старые таблицы ISAM, было как раз как вы хотите, это считается плохо и вот почему. Допустим, есть записи
1 "Text1"
2 "Text2"
3 "Text3"
4 "Text4"
|
Удаляем записи 2 и 3 и вставляем "Text5", в результате получится вот что:
1 "Text1"
2 "Text5"
4 "Text4"
|
Безобразие! Поэтому в таблицах MyISAM, механизм AUTO_INCREMENT был изменён и результатом будет:
1 "Text1"
4 "Text4"
5 "Text5"
|
А зачем неразрывное следование первичного ключа? Главным его свойством считается уникальность… Для чего это понадобилось, может можно обойти это? | |
|
|
|
|
|
|
|
для: cheops
(15.07.2004 в 21:19)
| | Просто хотелось, что бы при добавлении новой записи
id =idмаксимального+1.
Я так понимаю это невозможно? | |
|
|
|
|
|
|
|
для: Andron
(15.07.2004 в 21:25)
| | Ну нет от чего же... для этого первичный ключ должен иметь атрибут AUTO_INCREMENT
CREATE TABLE links (
id_links int(8) NOT NULL auto_increment,
name text,
PRIMARY KEY (id_links)
) TYPE=MyISAM;
|
Тогда добавление записи
INSERT INTO links (NULL, "Имя");
|
Как раз и добавит id_links равный максимальному значению ключа плюс 1. Если вам тут же понадобится значение первичного ключа для только что вставленной записи можно воспользоваться функцией mysql_insert_id()
<?php
mysql_query("INSERT INTO links (NULL, 'Имя'))";
id_links = mysql_insert_id();
?>
|
http://www.softtime.ru/dic/id_dic=116&id_group=2 | |
|
|
|
|
|
|
|
для: cheops
(15.07.2004 в 22:07)
| | Нет, вы меня не поняли.
Пусть есть 10 последовательных записей, первичный ключ id имеет атрибут AUTO_INCREMENT.
После удаления последних девяти записей будет такая ситуация :
id name
1 text1
И дальше при добавлении новой записи, ее id будет равным 11, хотя записей всего 2.
| |
|
|
|
|
|
|
|
для: Andron
(15.07.2004 в 22:32)
| | Ну хорошо, хотите поработать за базу данных :)))? Можно тогда сделать так:
<?php
// Перед вставкой нового значения явно запросить максимальное
// значение первичного ключа
$query = "SELECT MAX(id) AS max FROM base";
$max = mysql_query($query);
if(!$max)
{
echo "Ошибка в запросе";
exit();
}
// Формируем значение первичного ключа сами
$id = mysql_result($max,0) + 1;
// Вставим новую запись
$query = "INSERT INTO base VALUES($id,'Новая запись')";
mysql_query($query);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(15.07.2004 в 22:47)
| | Но это дополнительный запрос перед каждой вставкой, если есть возможность - лучше этого избегать. | |
|
|
|
|
|
|
|
для: cheops
(15.07.2004 в 22:45)
| | Ок. Я понял. Но надеялся, что есть какие-то ф-ии, типа апдейт или рефреш.
Спасибо. | |
|
|
|
|
|
|
|
для: cheops
(15.07.2004 в 22:47)
| | Погоди-ка. А разве так пойдет?
Допустим, есть
id=1
id=2
id=3
удалим записи с id равным 1 и 2. Добавим следущий элемент. Id будет равен 4. А Андрон хотел чтобы они шли по порядку (я так понял)
| |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(15.07.2004 в 23:53)
| | Ну так-то так, а если посетитель удалит id=2, будет же разрыв... в условиях хе не оговаривается какой из элементов будет удалён... Я тут повспоминал, обычно, для того, чтобы организовать сплошное следование ключей, советуют уничтожить столбец и создать его по новой - тогда он автоматически заполнится последовательными уникальными значениями, но не удалять же целый столбец при каждой вставке.... особенное если есть связи с другими таблицами. | |
|
|
|