2009-10-08 1 views
1

У меня есть простая таблица с двумя столбцами, каждый столбец является ключевым значением. значения, хранящиеся в каждом поле, являются varchar (45), представляющими адрес электронной почты и ключевое слово. Возможно, что собранная информация может дублировать себя, поскольку она связана с сбором данных о просмотре сайтов. Во избежание дублирования записей, я использовал пытались использовать INSERT IGNORE в, REPLACE в, и, наконец, я пытаюсь следующее:MySql «INSERT ... ON DUPLICATE KEY UPDATE» все еще вставляет повторяющиеся записи. Что мне не хватает?

insert into <table name> (user_email, key_token) values ('<email>@<this>.com', 'discountsupplies') on duplicate key update user_email='<email>@<this>.com',key_token='discountsupplies'; 

, но я до сих пор видим повторяющиеся записи вставляются в таблицу. SQL, который сгенерировал таблицу:

DROP TABLE IF EXISTS `<database name>`.`<table name>` ; 

CREATE TABLE IF NOT EXISTS `<database name>`.`<table name>` (
    `user_email` VARCHAR(45) NOT NULL , 
    `key_token` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`user_email`, `key_token`)) 
ENGINE = InnoDB; 

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


В качестве дополнения, после добавления UNIQUE KEY заявления, я вернулся и попытался как REPLACE и INSERT IGNORE для достижения своей цели, и ни один из этих вариантов не является исключением повторяющихся записей.

Также добавляет: УНИКАЛЬНЫЙ ИНДЕКС (user_email, key_token) также не помогает.

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


Добавлен уникальный индекс строки ниже первоначального создания таблицы заявления -

-- ----------------------------------------------------- 
-- Table `<db name>`.`<table name>` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `<db name>`.`<table name>` ; 

CREATE TABLE IF NOT EXISTS `<db name>`.`<table name>` (
    `user_email` VARCHAR(45) NOT NULL , 
    `key_token` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`user_email`, `key_token`), 
    UNIQUE KEY (user_email), 
    UNIQUE KEY (key_token) 
) 

ENGINE = InnoDB; 

CREATE UNIQUE INDEX ix_<table name>_useremail on `<db name>`.`<table name>`(user_email); 
CREATE UNIQUE INDEX ix_<table name>_keytoken on `<db name>`.`<table name>`(key_token); 

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

+0

Что вы имеете в виду дублей? У вас есть два одинаковых письма в одном столбце (с 'UNIQUE', определенным в этом столбце)? – Quassnoi

+0

Не могли бы вы опубликовать некоторые данные, которые вы согласуете с дубликатом? – Quassnoi

+0

Это первый появившийся фрагмент «вырезанный и вставленный» из таблицы (электронная почта была изменена с оригинального адреса для конфиденциальности), которая демонстрирует дублирование. Третья запись добавляется, хотя первая запись явно находится в таблице. [email protected] \t Tempurpedic-кровать [email protected] \t дети безопасности-ворот [email protected] \t Tempurpedic-кровать – 2009-10-08 15:23:41

ответ

0

окончательное решение сейчас: таблица запроса получить список key_tokens по user_email, проверить текущий key_token в отношении записей в списке, если они не найдены. не оптимальна или красиво, но это работает ....

+0

Quassnoi предоставил много помощи - если бы я получил ситуацию с моей таблицей, чтобы работать, как я предполагал, я бы выбрал один из ответов в качестве окончательного решения. Это то, что я в конечном итоге использовал, поэтому я выбираю это как неоптимальное, но работающее решение. – 2009-10-13 15:08:08

1

У вас есть составной первичный ключ на обоих столбцах.

Это означает, что это комбинация полей UNIQUE, а не каждое поле как есть.

Thes данные можно в таблице:

1[email protected] 1 
[email protected] 1 
[email protected] 2 

, так как никакой комбинации (user_email, key_token) повторов в таблице, в то время как user_email и key_token, как сами по себе могут повторяться.

Если вы хотите, чтобы каждый отдельный столбец будет UNIQUE, определить UNIQUE ограничения на полях:

CREATE TABLE IF NOT EXISTS `<database name>`.`<table name>` (
    `user_email` VARCHAR(45) NOT NULL , 
    `key_token` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`user_email`, `key_token`), 
    UNIQUE KEY (user_email), 
    UNIQUE KEY (key_token) 
) 
ENGINE = InnoDB; 

Update

Возникли дубликаты в столбце, помеченный как UNIQUE бы уровень 1 ошибка в MySQL.

Не могли бы вы, пожалуйста, выполните следующие запросы:

SELECT user_email 
FROM mytable 
GROUP BY 
     user_email 
HAVING COUNT(*) > 1 

SELECT key_token 
FROM mytable 
GROUP BY 
     key_token 
HAVING COUNT(*) > 1 

и посмотреть, если они что-то вернуть?

+0

Благодарим вас за помощь. Я просто попытался добавить инструкции UNIQUE KEY() и сбросить тестовую базу данных, чтобы попробовать это. Боюсь, я все еще получаю дубликаты. Ваш пример выше, насколько я пытаюсь достичь в таблице с данными, которые у меня есть. – 2009-10-08 14:02:42

+0

Пробовал оба запроса - я получил значения для обоих запросов, но я не получил всех адресов электронной почты в таблице, и я не получил все ключевые слова - только некоторые из них. – 2009-10-08 15:29:21

+0

Вы не создали два отдельных 'UNIQUE KEYs', вы создаете один составной. Выполните это: 'CREATE UNIQUE INDEX ix_mytable_useremail ON mytable (user_email)' – Quassnoi

0

PRIMARY KEY (user_email,key_token) означает сочетание обоих будет уникальным, но если вы хотите индивидуальный адрес электронной почты и key_tokens быть уникальным, вы должны использовать UNIQUE отдельно для каждого столбца ..

PRIMARY KEY ('user_email', 'key_token'), 
    UNIQUE KEY (user_email), 
    UNIQUE KEY (key_token) 
0

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

CREATE TABLE IF NOT EXISTS `<database name>`.`<table name>` (
    `user_email` VARCHAR(45) NOT NULL , 
    `key_token` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`user_email`), 
    INDEX (`user_email`, `key_token`) 
) 

Конечно, если вы обеспокоены получением дубликата key_token, вам по-прежнему нужен уникальный индекс.

К сожалению, я очень поздно, чтобы ответить, но, возможно, кто-то наткнется на это, как я :)

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