Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: MySQL AUTO_INCREMENT

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: help
Dezmont
Отправлено: 14 Марта, 2012 - 15:40:47
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Июль 2010  


Помог: 1 раз(а)




Добрый день, подскажите пожалуйста, где я торможу. =/

Делаю INSERT в таблицу. 1-ый столбец AUTO_INCREMENT, на втором столбце ограничение UNIQUE.
Если во 2-ой столбец вставляю не уникальное значение, то вылетает ошибка: Duplicate Entery, и AUTO_INCREMENT 1 столбца всё равно увеличивается. Просто следующая удачная запись уже будет иметь id не 17, а 19. И соответственно, сколько раз ошибка вылезет, столько раз и будет увеличиваться id.

Как избавиться от этой напасти? Есть может какие-нибудь надстройки, или ещё что?
 
 Top
EuGen Администратор
Отправлено: 14 Марта, 2012 - 15:48:44
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Dezmont
CODE (htmlphp):
скопировать код в буфер обмена
  1. mysql> select version();
  2. +-----------+          
  3. | version() |          
  4. +-----------+          
  5. | 5.0.84    |          
  6. +-----------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql> select * from test;
  10. +----+----+
  11. | id | uk |
  12. +----+----+
  13. |  1 |  1 |
  14. |  2 |  2 |
  15. |  3 |  3 |
  16. +----+----+
  17. 3 rows in set (0.00 sec)
  18.  
  19. mysql> insert into test (uk) values (3);
  20. ERROR 1062 (23000): Duplicate entry '3' for key 2
  21. mysql> select * from test;
  22. +----+----+
  23. | id | uk |
  24. +----+----+
  25. |  1 |  1 |
  26. |  2 |  2 |
  27. |  3 |  3 |
  28. +----+----+
  29. 3 rows in set (0.00 sec)
  30.  
  31. mysql> insert into test (uk) values (4);
  32. Query OK, 1 row affected (0.05 sec)
  33.  
  34. mysql> select * from test;
  35. +----+----+
  36. | id | uk |
  37. +----+----+
  38. |  1 |  1 |
  39. |  2 |  2 |
  40. |  3 |  3 |
  41. |  4 |  4 |
  42. +----+----+
  43. 4 rows in set (0.00 sec)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
UNTRUSTED
Отправлено: 14 Марта, 2012 - 15:50:17
Post Id


Частый гость


Покинул форум
Сообщений всего: 255
Дата рег-ции: Март 2012  


Помог: 2 раз(а)




Не пытаться записать дубликат в уникальное поле!!!
Либо перед записью проверять на наличие такого имени в базе!!!
(Добавление)
Два варианта!!
1. Либо не пытаться записать дубликат в уникальное поле!!!
2. Либо перед записью проверять на наличие такого имени в базе!!!
 
 Top
Dezmont
Отправлено: 14 Марта, 2012 - 15:59:53
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Июль 2010  


Помог: 1 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. mysql> CREATE TEMPORARY TABLE test(id int unsigned not null auto_increment, pole
  2.  int, primary key(id), unique key (`pole`));
  3. Query OK, 0 rows affected (0.08 sec)
  4.  
  5. mysql> INSERT INTO test VALUES (1);
  6. ERROR 1136 (21S01): Column count doesn't match value count at row 1
  7. mysql> INSERT INTO test (`pole`) VALUES (1);
  8. Query OK, 1 row affected (0.00 sec)
  9.  
  10. mysql> INSERT INTO test (`pole`) VALUES (2);
  11. Query OK, 1 row affected (0.02 sec)
  12.  
  13. mysql> INSERT INTO test (`pole`) VALUES (3);
  14. Query OK, 1 row affected (0.00 sec)
  15.  
  16. mysql> SELECT * FROM test;
  17. +----+------+
  18. | id | pole |
  19. +----+------+
  20. |  1 |    1 |
  21. |  2 |    2 |
  22. |  3 |    3 |
  23. +----+------+
  24. 3 rows in set (0.00 sec)
  25.  
  26. mysql> INSERT INTO test (`pole`) VALUES (3);
  27. ERROR 1062 (23000): Duplicate entry '3' for key 'pole'
  28. mysql> INSERT INTO test (`pole`) VALUES (4);
  29. Query OK, 1 row affected (0.00 sec)
  30.  
  31. mysql> SELECT * FROM test;
  32. +----+------+
  33. | id | pole |
  34. +----+------+
  35. |  1 |    1 |
  36. |  2 |    2 |
  37. |  3 |    3 |
  38. |  5 |    4 |
  39. +----+------+
  40. 4 rows in set (0.00 sec)
  41.  
  42. mysql> SELECT VERSION();
  43. +------------------+
  44. | VERSION()        |
  45. +------------------+
  46. | 5.1.40-community |
  47. +------------------+
  48. 1 row in set (0.00 sec)
  49.  

(Отредактировано автором: 14 Марта, 2012 - 16:01:05)

 
 Top
UNTRUSTED
Отправлено: 14 Марта, 2012 - 16:03:36
Post Id


Частый гость


Покинул форум
Сообщений всего: 255
Дата рег-ции: Март 2012  


Помог: 2 раз(а)




у одного меня ответ такой тупой Голливудская улыбка Радость
 
 Top
Dezmont
Отправлено: 14 Марта, 2012 - 16:05:57
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Июль 2010  


Помог: 1 раз(а)




Проблему обнаружил. Это особенность движка INNODB. В MyISAM всё работает нормально, как у Евгения.

EuGen, вы случайно не знаете как перебороть этот недостаток для InnoDB? Может есть какая-нибудь надстройка? А то загромождать скрипт проверкой ID не хочется...
И на триггеры заморачиваться не хочется...=(

(Отредактировано автором: 14 Марта, 2012 - 16:08:48)

 
 Top
EuGen Администратор
Отправлено: 14 Марта, 2012 - 16:15:59
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Dezmont
Нет, не InnoDB:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. mysql> show create table test;
  3. +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  4. | Table | Create Table                                                                                                                                                                                                     |
  5. +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  6. | test  | CREATE TABLE `test` (
  7.   `id` int(11) unsigned NOT NULL auto_increment,
  8.   `uk` int(11) unsigned NOT NULL,
  9.   PRIMARY KEY  (`id`),
  10.   UNIQUE KEY `uk` (`uk`)
  11. ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 |
  12. +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  13. 1 row in set (0.00 sec)
  14.  


?
Вероятно, дело не в InnoDB а в его настройках. Вот мой дамп, сравните со своим - может, найдете причину (так сразу сказать не могу, но пока найду - может, Вы сами определите)
CODE (htmlphp):
скопировать код в буфер обмена
  1. mysql> show variables like '%innodb%';
  2. +-----------------------------------------+------------------------+
  3. | Variable_name                           | Value                  |
  4. +-----------------------------------------+------------------------+
  5. | have_innodb                             | YES                    |
  6. | innodb_additional_mem_pool_size         | 1048576                |
  7. | innodb_autoextend_increment             | 8                      |
  8. | innodb_buffer_pool_awe_mem_mb           | 0                      |
  9. | innodb_buffer_pool_size                 | 8388608                |
  10. | innodb_checksums                        | ON                     |
  11. | innodb_commit_concurrency               | 0                      |
  12. | innodb_concurrency_tickets              | 500                    |
  13. | innodb_data_file_path                   | ibdata1:10M:autoextend |
  14. | innodb_data_home_dir                    |                        |
  15. | innodb_adaptive_hash_index              | ON                     |
  16. | innodb_doublewrite                      | ON                     |
  17. | innodb_fast_shutdown                    | 1                      |
  18. | innodb_file_io_threads                  | 4                      |
  19. | innodb_file_per_table                   | OFF                    |
  20. | innodb_flush_log_at_trx_commit          | 1                      |
  21. | innodb_flush_method                     |                        |
  22. | innodb_force_recovery                   | 0                      |
  23. | innodb_lock_wait_timeout                | 50                     |
  24. | innodb_locks_unsafe_for_binlog          | OFF                    |
  25. | innodb_log_arch_dir                     |                        |
  26. | innodb_log_archive                      | OFF                    |
  27. | innodb_log_buffer_size                  | 1048576                |
  28. | innodb_log_file_size                    | 5242880                |
  29. | innodb_log_files_in_group               | 2                      |
  30. | innodb_log_group_home_dir               | ./                     |
  31. | innodb_max_dirty_pages_pct              | 90                     |
  32. | innodb_max_purge_lag                    | 0                      |
  33. | innodb_mirrored_log_groups              | 1                      |
  34. | innodb_open_files                       | 300                    |
  35. | innodb_rollback_on_timeout              | OFF                    |
  36. | innodb_support_xa                       | ON                     |
  37. | innodb_sync_spin_loops                  | 20                     |
  38. | innodb_table_locks                      | ON                     |
  39. | innodb_thread_concurrency               | 8                      |
  40. | innodb_thread_sleep_delay               | 10000                  |
  41. | innodb_use_legacy_cardinality_algorithm | ON                     |
  42. +-----------------------------------------+------------------------+
  43. 37 rows in set (0.00 sec)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Dezmont
Отправлено: 15 Марта, 2012 - 09:03:17
Post Id



Частый гость


Покинул форум
Сообщений всего: 245
Дата рег-ции: Июль 2010  


Помог: 1 раз(а)




Может кому-нибудь понадобится. Нашёл ответ в мануале.

    Beginning with MySQL 5.1.22, InnoDB provides a locking strategy that significantly improves scalability and performance of SQL statements that add rows to tables with AUTO_INCREMENT columns.


В настройке по умолчанию innodb_autoinc_lock_mode = 1. Изменил innodb_autoinc_lock_mode = 0, работает как обычно, но разработчики не рекомендуют использовать этот режим.

В общем вот документация: Auto_increment handling in InnoDB

Евгений, спасибо за подсказку. Дамп помог. )

(Отредактировано автором: 15 Марта, 2012 - 09:14:06)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB