MySQL error : Duplicate entry?
14 отговора
593 прегледа
MySQL error : Duplicate entry?
MySQL error : Duplicate entry '2147483647' for key 1 - na nqkoi govori li mu neshto tova?
.....and let the sun shine....
.....and let the sun shine....
Re: MySQL error : Duplicate entry?
На пичовете от клуб "Бази данни" със сигурност ще им говори.
Re: MySQL error : Duplicate entry?
Кво му мислиш, имаш дублиране на първичния ключ.
Вече имаш запис с ключ 2147483647
Ако не си наясно, само знай, че всеки запис в базата, трябва да има първичен ключ, който е уникална стойност. Така че прегледай си базата и виж дали наистина е така.
Кой ли съм пък аз?
Вече имаш запис с ключ 2147483647
Ако не си наясно, само знай, че всеки запис в базата, трябва да има първичен ключ, който е уникална стойност. Така че прегледай си базата и виж дали наистина е така.
Кой ли съм пък аз?
Re: MySQL error : Duplicate entry?
Означава че ауто инкремент полето, коети ти е праймъри кий е стигнало до последната възможна стойност, която е 1111111111111111111111111111111 бинарно.
root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy
root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy
Re: MySQL error : Duplicate entry?
Буквално означава, че вече имаш тази стойност в полето, индексирано от ключ 1. Най-вероятно в случая броячът е стигнал до максималната възможна стойност за тип signed int, която е: 2^31 - 1 = 2147483647. Това, което можеш да направиш е да преминеш към тип int unsigned, т.е. да използваш най-старшия бит (бита за знак) за запазването на още толкова числа и да достигнеш максимална стойност от 2^32 - 1 или 2147483648*2 - 1 = 4294967295, ако и това не ти стига и си сигурна, че скоро пак ще достигнеш до тази стойност направо минаваш към тип bigint unsigned, който вече разчита на двойно повече битове - 64 и максималната му стойност е 2^64 - 1 или просто 4294967296^2 - 1 = 18446744073709551616. Но дори и int unsigned в повечето случаи е достатъчно...4294967295 са си четири милиарда, откъдето и да го погледнем, а това е горе-долу половината човечество.
При всички положения за auto_increment поле ти трябва unsigned тип.
За повече инфо виж: [линк]
Everything louder than everything else...
При всички положения за auto_increment поле ти трябва unsigned тип.
За повече инфо виж: [линк]
Everything louder than everything else...
Re: MySQL error : Duplicate entry?
Не забравяй поведението на MySQL-a когато се опиташ да вкараш в unsigned numeric primary key -1. Тогава обикновено без ръчна доработка повече не можеш да вкараш повече данни. Предполагам, че колегата дето е спамнал форумите (тази тема я има на повече от едно място) се опитал да набие вместо ауто инкремента някое число решено от него и сървъра не го е харесал особено и ....
Re: MySQL error : Duplicate entry?
Това трябва да е бая база, щом има над 2 милиарда записа.
, или е така или бая фира е хвърлена някъде.
2147483647 наистина е лимита на signed int-а, но все си мисля, че нещо друго е сгафено с данните в първичния ключ.
Кой ли съм пък аз?
2147483647 наистина е лимита на signed int-а, но все си мисля, че нещо друго е сгафено с данните в първичния ключ.
Кой ли съм пък аз?
Редактирано от vanoli на
Re: MySQL error : Duplicate entry?
Всъщност би трябвало да вкара 0, а не да прескочи на 2^32-1...но кой знае, на по-стари версии може и да го има това поведение, за което говориш.
Everything louder than everything else...
Everything louder than everything else...
Re: MySQL error : Duplicate entry?
CREATE TABLE `xxx` (
`id` tinyint NOT NULL auto_increment,
PRIMARY KEY (`id`)
) TYPE=MyISAM
INSERT INTO `xxx` ( `id` ) VALUES ('1234');
SELECT * FROM `xxx` ;
+-----+
| id |
+-----+
| 127 |
+-----+
1 row in set (0.00 sec)
root@ro6avia#echo rm -rf * > /bin/seek_and_destroy
root@ro6avia#/bin/seek_and_destroy
Редактирано от ro6avia на
хммм
Така може, но с -1 би трябвало да запише 0. 
Everything louder than everything else...
Everything louder than everything else...
Re: MySQL error : Duplicate entry?
mysql> CREATE TABLE `xxx` (
->
-> `id` tinyint NOT NULL auto_increment,
->
-> PRIMARY KEY (`id`)
->
-> ) TYPE=MyISAM;
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> INSERT INTO `xxx` ( `id` ) VALUES ('1234');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------+
| Warning | 1264 | Data truncated; out of range for column 'id' at row 1 |
+---------+------+-------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM xxx; +-----+
| id |
+-----+
| 127 |
+-----+
1 row in set (0.01 sec)
salle.online.bg/sig
->
-> `id` tinyint NOT NULL auto_increment,
->
-> PRIMARY KEY (`id`)
->
-> ) TYPE=MyISAM;
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> INSERT INTO `xxx` ( `id` ) VALUES ('1234');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------+
| Warning | 1264 | Data truncated; out of range for column 'id' at row 1 |
+---------+------+-------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM xxx; +-----+
| id |
+-----+
| 127 |
+-----+
1 row in set (0.01 sec)
salle.online.bg/sig
Re: И защо "би трябвало"?
С това, че това е долната граница на типа, т.е. ако се подаде стойност извън границите на интервала, MySQL бута последната гранична възможна стойност.
Everything louder than everything else...
Everything louder than everything else...
Re: Ама това не отговаря на въпроса ми нали?
С какво 0 е по-логично от 127 ?
salle.online.bg/sig
salle.online.bg/sig
аз точно на въпроса се опитах да отговоря
Всъщност не 127, а 255 е в случая. Опитах се да обясня защо е по-логично, изхождайки от практиката:
Възможно е съжденията ми да с погрешни, както и Коперник се е пообъркал навремето лекичко, изхождайки също като мен от практиката, но наистина мисля, че съм отговорил на въпроса ти.
Everything louder than everything else...
mysql> create table tbl (id tinyint unsigned);
Query OK, 0 rows affected (0.04 sec)
mysql> insert into tbl values (1),(2),(500),(-5);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 2
mysql> select * from tbl;
+------+
| id |
+------+
| 1 |
| 2 |
| 255 |
| 0 |
+------+
4 rows in set (0.01 sec)
Възможно е съжденията ми да с погрешни, както и Коперник се е пообъркал навремето лекичко, изхождайки също като мен от практиката, но наистина мисля, че съм отговорил на въпроса ти.
Everything louder than everything else...