1

я получил следующую таблицу, используемую для отслеживания пользователей, которые смотрят тикетMySQL Составной первичный Понижение ключ к более ограничительным

CREATE TABLE IF NOT EXISTS crm_ticketwatcher (
    ticketid int(10) unsigned NOT NULL DEFAULT '0', 
    employeeid int(10) unsigned NOT NULL DEFAULT '0', 
    contactid int(10) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (ticketid,employeeid,contactid) 
) ENGINE=MyISAM; 

Я хочу иметь сценарий, который удаляет понизить ContactID из первичного ключа ,

Содержание таблицы выглядит немного как этот

ticketid|employeeid|contactid 
--------|----------|--------- 
5  |5   |0 
5  |8   |0 
5  |0   |2 
5  |0   |3 

Когда я бегу мой (неудачную) понизить сценарий,

ALTER TABLE crm_ticketwatcher DROP PRIMARY KEY, ADD PRIMARY KEY (ticketid, employeeid);

Я получаю следующее сообщение об ошибке:

ERROR 1062 (23000) at line 1: Duplicate entry '306-0' for key 'PRIMARY'

, потому что теперь есть 2 строки с набором первичных ключей (5, 0)

Каков наилучший способ удалить дополнительные строки из таблицы, сохранив последний из них?

Мы находимся на MySQL 5.7.13, поэтому ключевое слово IGNORE не является вариантом.

Спасибо.

+0

Можете ли вы также рассказать мне о структуре таблицы, в которой вы получите информацию о «последних встречах»? как дата. Или вы просто хотите сохранить самый высокий или самый низкий контактный ряд? Кого вы держите (5, 0, 2) или (5, 0, 3)? – Tin

+0

(5, 0, 3) будет сохранено, потому что это самый низкий ряд –

+0

. Думаю, ответ eggyal должен работать на этот случай. – Tin

ответ

0

Как указано под ALTER TABLE Syntax:

IGNORE is a MySQL extension to standard SQL. It controls how ALTER TABLE works if there are duplicates on unique keys in the new table or if warnings occur when strict mode is enabled. If IGNORE is not specified, the copy is aborted and rolled back if duplicate-key errors occur. If IGNORE is specified, only one row is used of rows with duplicates on a unique key. The other conflicting rows are deleted. Incorrect values are truncated to the closest matching acceptable value.

Таким образом, вы можете сделать:

ALTER IGNORE TABLE crm_ticketwatcher 
    DROP PRIMARY KEY, 
    ADD PRIMARY KEY (ticketid, employeeid); 

Заметим, однако, что, какой из сохраняется "Дубликат" строк будут неопределенными.

Если вы хотите более детерминированный результат, или с использованием MySQL v5.7.4 и более поздние версиями (из которых IGNORE был удален), вы можете сначала выполнить автообъединение с множественными таблицами DELETE синтаксиса:

DELETE c1 
FROM crm_ticketwatcher c1 
    JOIN crm_ticketwatcher c2 USING (ticketid, employeeid) 
WHERE c1.contactid < c2.contactid -- or whatever logic you prefer 
+0

Я получил ошибку, используя это и нашел это на странице документации MySQL. 'Начиная с MySQL 5.7.4, предложение IGNORE для ALTER TABLE удаляется, и его использование вызывает ошибку. –

+0

@GavinGassmann: И для избежания сомнения, вы используете версию MySQL ≥5.7.4? – eggyal

+0

Да, я добавлю версию в OP. –

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

  • Нет связанных вопросов^_^