2016-04-04 3 views
0

Я испытываю ошибку при создании уникального ограничения ключа в MySQL. У меня есть уникальное ключевое ограничение в MySQL. У меня есть таблица с двумя столбцами типа VARCHAR(), и мне нужно создать уникальное ограничение ключа с этими двумя столбцами, однако, когда я создаю ошибку с повторяющейся записью. Я уверен, что это не повторяющаяся запись, потому что эти два столбца представляют собой список содержимого каталога в Windows, который по умолчанию не принимает имена файлов, одинаковые в одной папке.mysql уникальная ошибка двух столбцов

Создать заявление:

DROP TABLE IF EXISTS `filelist`.`fileserver`; 
CREATE TABLE `filelist`.`fileserver` (
    `nome` varchar(300) NOT NULL, 
    `caminho` varchar(500) NOT NULL, 
    `dataCriacao` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `dataUltimoAcesso` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `dataUltimaModificacao` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `tamanho` bigint(20) unsigned NOT NULL DEFAULT '0' 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; 

Команда для создания уникального ключа ограничения:

ALTER TABLE filelist.fileserver ADD UNIQUE(`caminho`, `nome`); 

Сообщение об ошибке:

Дублировать запись «F: \ Fileserver \ ОМ \ OM_ADMINISTRATIVO \ Виагем \ Autorizações \ 2014 \ 10 'для ключа' caminho '

Содержание таблицы:

SELECT * FROM filelist.fileserver WHERE caminho LIKE 'F:\\\\Fileserver\\\\OM\\\\OM_ADMINISTRATIVO\\\\VIAGEM\\\\Autorizações\\\\2014\\\\10%' ORDER BY nome; 

nome 
Alex - 02 a 03 de outubro.pdf 
Alex - 28 a 31 de outubro.pdf 
Antonio e Donizete - 17 de outubro.pdf 
Arianny - 27 a 28 de outubro.pdf 
Denison - 07 a 10 de outubro.pdf 
Denison - 29 a 31 de outubro.pdf 
Edeildo - 14 a 17 de outubro.pdf 
Edeildo - 27 a 31 de outubro.pdf 
Edeildo - 29 de setembro a 01 de outubro.pdf 
Guilherme - 14 de outubro.pdf 
Guilherme - 16 de outubro.pdf 
Guilherme - 21 a 23 de outubro.pdf 
Guilherme - 27 de outubro.pdf 
Jan - 30 de setembro a 10 de outubro.pdf 
Jan - 30 de setembro a 24 de outubro.pdf 
Jose Eduardo - 12 a 17 de outubro.pdf 
José Eduardo - 12 a 17 de outubro.pdf 
Lucette - 29 de outubro a 07 de novembro.pdf 
Lucette - 30 de setembro a 2 de outubro.pdf 
Luis - 06 a 07 de outubro.pdf 
Luis Claudio - 09 a 10 de outubro.pdf 
Luis Claudio - 30 a 31 de outubro.pdf 
Mariana - 01 a 03 de outubro.pdf 
Mateus - 16 a 19 de outubro.pdf 
Mauricio - 13 a 17 de outubro.pdf 
Paulo - 14 a 17 de outubro.pdf 
Paulo - 27 a 31 de outubro.pdf 
Paulo - 29 de setembro a 01 de outubro.pdf 
Rogério - 09 a 10 de outubro.pdf 
Ronaldo - 02 a 03 de outubro.pdf 
Ronaldo - 06 a 07 de outubro.pdf 
Ronaldo - 16 de outubro.pdf 
Ronaldo - 21 de outubro.pdf 
Ronaldo - 27 a 28 de outubro.pdf 
Ronaldo - Locação de Veículo.pdf 
Silvana - 05 a 10 de outubro.pdf 
Silvana - 05 a 24 de outubro.pdf 
Tiago - 07 a 10 de outubro.pdf 

[] s

+0

Если вы хотите УДАЛИТЬ дубликаты exisintg, вы можете сделать 'ALTER IGNORE TABLE filelist.fileserver ADD UNIQUE (' caminho ',' nome'); ' – Mihai

ответ

0

Я думаю, что проблема приходит из этих 2-х строк:

Jose Eduardo - 12 a 17 de outubro.pdf 
José Eduardo - 12 a 17 de outubro.pdf 

Конечно проблема сортировки, попробуйте эти 2 команды, и вы увидите разницу:

SELECT 'é' = 'e' COLLATE utf8_general_ci; 
SELECT 'é' = 'e' COLLATE utf8_bin; 

Первый матч, второй нет.

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

+0

Hi FLefèvre, я изменяю сортировку на utf8_bin и снова запускаю команду для создания ограничения. Такая же ошибка. Знаете ли вы, нужно ли повторно вставлять все данные в таблицу, потому что изменение сортировки? –

+0

Попробуйте преобразовать таблицу: проверьте 'CONVERT TO CHARACTER SET' [здесь] (http://dev.mysql.com/doc/refman/5.7/en/alter-table.html) –

+0

Подтверждено:' ​​ALTER TABLE table CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin' разрешает проблему –

0

Somehwere в вашем databese значения для Caminho: 'F: \ FILESERVER \ ОМ \ OM_ADMINISTRATIVO \ Виагем \ Autorizações \ 2014 \ 10' уже сохранен, сделайте ваш "select * from .." без \\\\, и вы должны его найти.

Вы также можете попробовать запрос:

Select * from * FROM filelist.fileserver WHERE caminho LIKE '%Autorizações%' 

% средств может быть больше символов до или после того, как это будет возвращать все результаты, содержащие «Autorizações».

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

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