Как обновить часть составного первичного ключа? - PullRequest
1 голос
/ 24 мая 2011

У меня есть сайт drupal, который использует поля содержимого CCK для хранения большинства своих данных.

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

UPDATE content_field_table SET vid = '1234' WHERE nid = '12' AND vid = '123';

Проблема в том, что content_field_table имеет составной первичный ключ

PRIMARY KEY (`vid`,`delta`)

Чтобы при запуске оператора update я получил следующую ошибку:

Код ошибки: 1062 Дублирующая запись '52979-0' для ключа 'ПЕРВИЧНАЯ'

Как я могу обновить VID по мере необходимости?

Ответы [ 2 ]

4 голосов
/ 24 мая 2011

Первичный ключ должен быть уникальным.Таким образом, вы не можете изменить одну запись, чтобы иметь такой же PK как существующую запись

Например, если вы получаете какие-либо записи из SQL ниже, обновление, которое вы хотите выполнить, не может быть выполнено.Вам сначала нужно будет сделать какое-то другое изменение, либо удалить запись, либо удалить PK

SELECT SOURCE.delta, 
       SOURCE.vid, 
       TARGET.delta, 
       TARGET.vid 
FROM   content_field_table SOURCE 
       INNER JOIN content_field_table TARGET 
         ON SOURCE.delta = TARGET.delta 
WHERE  SOURCE.vid = '123' 
       AND TARGET.vid = '1234' 
2 голосов
/ 24 мая 2011

Не меняйте свои первичные ключи.Также не используйте составные первичные ключи когда бы ни было возможно.MySQL (и другие базы данных) хранят записи в страницах в порядке PK.MySQL заполнит каждую страницу на 15/16 до того, как выделит место для новой страницы и вставит туда больше данных.

Проблема с составными PK или смена PK - фрагментация.Я не имею в виду фрагментацию диска, я имею в виду фрагментацию индекса.По мере перемещения ПК данные должны перемещаться по диску, чтобы сохранить их в правильном порядке.В зависимости от набора данных MySQL может потребоваться переместить много физических строк, чтобы сделать это.

То же самое касается обновления вашего PK.Изменение PK меняет порядок на диске и требует перемещения многих строк.Если возможно, используйте автоинкрементный PK или не используйте PK и позвольте MySQL создать для вас внутренний PK.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...