Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Значение уникального ключа

Сообщения:  [1-10] 

 
 автор: cheops   (16.07.2004 в 00:20)   письмо автору
 
   для: glsv (Дизайнер)   (15.07.2004 в 23:53)
 

Ну так-то так, а если посетитель удалит id=2, будет же разрыв... в условиях хе не оговаривается какой из элементов будет удалён... Я тут повспоминал, обычно, для того, чтобы организовать сплошное следование ключей, советуют уничтожить столбец и создать его по новой - тогда он автоматически заполнится последовательными уникальными значениями, но не удалять же целый столбец при каждой вставке.... особенное если есть связи с другими таблицами.

   
 
 автор: glsv (Дизайнер)   (15.07.2004 в 23:53)   письмо автору
 
   для: cheops   (15.07.2004 в 22:47)
 

Погоди-ка. А разве так пойдет?
Допустим, есть
id=1
id=2
id=3

удалим записи с id равным 1 и 2. Добавим следущий элемент. Id будет равен 4. А Андрон хотел чтобы они шли по порядку (я так понял)

   
 
 автор: Andron   (15.07.2004 в 22:52)   письмо автору
 
   для: cheops   (15.07.2004 в 22:45)
 

Ок. Я понял. Но надеялся, что есть какие-то ф-ии, типа апдейт или рефреш.
Спасибо.

   
 
 автор: cheops   (15.07.2004 в 22:47)   письмо автору
 
   для: 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:45)   письмо автору
 
   для: cheops   (15.07.2004 в 22:47)
 

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

   
 
 автор: Andron   (15.07.2004 в 22:32)   письмо автору
 
   для: cheops   (15.07.2004 в 22:07)
 

Нет, вы меня не поняли.
Пусть есть 10 последовательных записей, первичный ключ id имеет атрибут AUTO_INCREMENT.
После удаления последних девяти записей будет такая ситуация :

id name
1 text1

И дальше при добавлении новой записи, ее id будет равным 11, хотя записей всего 2.

   
 
 автор: cheops   (15.07.2004 в 22:07)   письмо автору
 
   для: 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

   
 
 автор: Andron   (15.07.2004 в 21:25)   письмо автору
 
   для: cheops   (15.07.2004 в 21:19)
 

Просто хотелось, что бы при добавлении новой записи
id =idмаксимального+1.
Я так понимаю это невозможно?

   
 
 автор: cheops   (15.07.2004 в 21:19)   письмо автору
 
   для: 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"
 

А зачем неразрывное следование первичного ключа? Главным его свойством считается уникальность… Для чего это понадобилось, может можно обойти это?

   
 
 автор: Andron   (15.07.2004 в 20:36)   письмо автору
 
 

Например есть таблица 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.

   

Сообщения:  [1-10] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования