2015-04-18 4 views
0

Моей проблема:MYSQL дублирования ошибки

Error: Duplicate entry '2' for key 'cnt_2'

Моего стол:

CREATE TABLE UploadLog(
id int(11) NOT NULL AUTO_INCREMENT, 
date text NOT NULL DEFAULT '', 
cnt int(11) NOT NULL DEFAULT 0, 
UNIQUE INDEX (id, cnt), 
PRIMARY KEY (id) 
) 

Моего PHP код:

$date1=date("Y-m-d"); 
$sql = "SELECT * FROM UploadLog WHERE date='$date1'"; 
$result = $conn->query($sql); 
$row = $result->fetch_assoc(); 
$dateindb=$row["cnt"]; 
if ($dateindb==0) {$dateindb=1;}; 
$sql = "INSERT INTO UploadLog (date, cnt) VALUES ('$date1', '$dateindb') ON DUPLICATE KEY UPDATE date=date, cnt=cnt+1"; 
if (mysqli_query($conn, $sql)) {} else {echo mysqli_error($conn)}; 

данные в MYSQL таблица:

+------+------------+-----+ 
| id | date  | cnt | 
+------+------------+-----+ 
| 1 | 2015-04-16 | 3 | 
| 2 | 2015-04-17 | 2 | 
| 3 | 2015-04-18 | 1 | 
+------+------------+-----+ 

Текущая дата = 2015-04-18.

Отредактировано:

Команда:

DESCRIBE DateLog

+-------+---------+------+-----+---------+----------------+ 
| Field | Type | Null | Key | Default | Extra   | 
+-------+---------+------+-----+---------+----------------+ 
| id | int(11) | NO | PRI | NULL | auto_increment | 
| date | text | NO |  | NULL |    | 
| cnt | int(11) | NO | UNI | 0  |    | 
+-------+---------+------+-----+---------+----------------+ 

Команда:

SHOW CREATE TABLE UploadLog

UploadLog | CREATE TABLE `UploadLog` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `date` text NOT NULL, 
    `cnt` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id` (`id`), 
    UNIQUE KEY `cnt_2` (`cnt`), 
    KEY `cnt` (`cnt`), 
    KEY `id_2` (`id`), 
    KEY `cnt_3` (`cnt`) 
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1 
+0

Что вы думаете об этом?почему вы ожидаете дублировать, когда id является первичным ключом и его автоматическое увеличение? – SMA

+0

@SMA у него есть уникальный индекс на 'cnt'. Он должен отказаться от уникального модификатора – DarkBee

+0

Можете ли вы запустить 'DESCRIBE UploadLog' и' SHOW CREATE TABLE UploadLog'? Я подозреваю, что таблица отличается от того, что вы создали ... (Откуда приходит ключ 'cnt_2'?) ... и кстати. любые внешние ключи, связанные с этой таблицей? – Fox

ответ

0

Я не могу объяснить, откуда исходит ошибка, но я ожидаю, что это вызвано различными версиями MySQL.

Но сначала я бы рекомендовал изменить столбец даты с текста на символ (10). Это связано с тем, что контент имеет очень определенную длину. После этого определение таблицы будет выглядеть следующим образом:

CREATE TABLE DateLog 
(
    id INT(11) NOT NULL AUTO_INCREMENT, 
    date CHAR(10) NOT NULL, 
    cnt INT DEFAULT 0 NOT NULL, 
    UNIQUE INDEX (id, date, cnt), 
    PRIMARY KEY (id) 
); 

Чтобы получить код работает, то вы должны просто добавить идентификатор в запросе вставки. Для этого ваш код будет немного измениться к:

$date1 = date("Y-m-d"); 
$sql = "SELECT * FROM DateLog WHERE date='$date1'"; 
$result = $conn->query($sql); 
$row = $result->fetch_assoc(); 
// Check if entry for the current date already exists 
if (null === $row) { 
    // If not, set id to NULL 
    $id = 'NULL'; 
    $dateindb = 1; 
} else { 
    // If it exist, use it 
    $id = $row["id"]; 
    $dateindb = $row["cnt"]; 
} 
// Insert with id 
$sql = "INSERT INTO DateLog (id, date, cnt) VALUES ($id,'$date1', '$dateindb') ON DUPLICATE KEY UPDATE cnt=cnt+1"; 
if (mysqli_query($conn, $sql)) { 
} else { 
    echo mysqli_error($conn); 
} 

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

Так просто изменить определение таблицы для:

CREATE TABLE DateLog 
(
    date CHAR(10) PRIMARY KEY NOT NULL, 
    cnt INT DEFAULT 1 
); 

После вы можете использовать это, чтобы сосчитать загрузки:

$date1 = date("Y-m-d"); 

$sql = "INSERT INTO DateLog (date) VALUES ('$date1') ON DUPLICATE KEY UPDATE cnt=cnt+1"; 
if (mysqli_query($conn, $sql)) { 
} else { 
    echo mysqli_error($conn); 
} 

Просто, или нет?

Надеюсь, это поможет.

0

Ошибка довольно очевидно ... Вы пытаетесь вставить дубликат вал ues в колонке, определенной как уникальная ...

cnt=cnt+21 дает вам 2, которые у вас уже есть в вашем столе.

0

Проблема заключается в поле cnt_2, которое является UNIQUE. Это означает, что он не может иметь одинаковое значение для двух разных регистров. Вы не устанавливаете его в запросе INSERT, поэтому оно принимает значение по умолчанию, которое уже существует в другом регистре.

Смежные вопросы