Есть самописный модуль . В отчете о состоянии ругаются на таблицу
Уровень изоляции транзакций
READ-COMMITTED
For this to work correctly, all tables must have a primary key. The following table(s) do not have a primary key: rating
что с этим делать? как написать патч к этой таблице в schema? в таблице есть записи. или вручную добавить в phpmyadmin primary key?
CREATE TABLE `rating` (
`tid` INT(11) NOT NULL,
`field1` INT(11) NOT NULL DEFAULT 0,
`field2` INT(11) NOT NULL DEFAULT 0,
`field3` INT(11) NOT NULL DEFAULT 0,
`field4` INT(11) NOT NULL DEFAULT 0,
`field5` INT(11) NOT NULL DEFAULT 0,
`field6` INT(11) NOT NULL DEFAULT 0,
`field7` INT(11) NOT NULL DEFAULT 0,
`field8` INT(11) NOT NULL DEFAULT 0,
`field9` INT(11) NOT NULL DEFAULT 0,
`total` INT(11) NOT NULL DEFAULT 0,
`type` VARCHAR(255) NOT NULL DEFAULT '',
`name` VARCHAR(255) NOT NULL DEFAULT '',
`date` DATE NOT NULL,
`fo_place` INT(11) NOT NULL DEFAULT 0,
`position` INT(11) NOT NULL DEFAULT 0,
KEY `region_id` (`tid`),
KEY `total` (`total`),
KEY `date` (`date`),
KEY `fo_place` (`fo_place`),
KEY `position` (`position`),
KEY `field1` (`field1`),
KEY `field2` (`field2`),
KEY `field3` (`field3`),
KEY `field4` (`field4`),
KEY `field5` (`field5`),
KEY `field6` (`field6`),
KEY `field7` (`field7`),
KEY `field8` (`field8`),
KEY `field9` (`field9`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_ci;
`tid` INT(11) NOT NULL,
`field1` INT(11) NOT NULL DEFAULT 0,
`field2` INT(11) NOT NULL DEFAULT 0,
`field3` INT(11) NOT NULL DEFAULT 0,
`field4` INT(11) NOT NULL DEFAULT 0,
`field5` INT(11) NOT NULL DEFAULT 0,
`field6` INT(11) NOT NULL DEFAULT 0,
`field7` INT(11) NOT NULL DEFAULT 0,
`field8` INT(11) NOT NULL DEFAULT 0,
`field9` INT(11) NOT NULL DEFAULT 0,
`total` INT(11) NOT NULL DEFAULT 0,
`type` VARCHAR(255) NOT NULL DEFAULT '',
`name` VARCHAR(255) NOT NULL DEFAULT '',
`date` DATE NOT NULL,
`fo_place` INT(11) NOT NULL DEFAULT 0,
`position` INT(11) NOT NULL DEFAULT 0,
KEY `region_id` (`tid`),
KEY `total` (`total`),
KEY `date` (`date`),
KEY `fo_place` (`fo_place`),
KEY `position` (`position`),
KEY `field1` (`field1`),
KEY `field2` (`field2`),
KEY `field3` (`field3`),
KEY `field4` (`field4`),
KEY `field5` (`field5`),
KEY `field6` (`field6`),
KEY `field7` (`field7`),
KEY `field8` (`field8`),
KEY `field9` (`field9`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_ci;
Комментарии
1. Добавить hook_update_NNN ()
(https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Extension...)
2. В нём добавить новое поле для primary key (или выбрать уже имеющееся, но с уникальным значением для каждого ряда).
3. Установить для этого поля признак primary key, типа:
$schema->addPrimaryKey('mytable', $field);
Пример: https://www.drupal.org/docs/drupal-apis/update-api/updating-database-sch...
спасибо, буду неспешно пробовать. только в таблице записи есть. и куда этот апдейт вставлять. в тело модуля rating.module?
1. Записи никуда не денутся, но лучше забекапиться перед обновлением.
2. Да, вставлять в код модуля (*.module).
3. После добавления кода выполнить обновление, типа drush updb или через UI Друпала.
Вообще-то, hook_update лучше писать в .install файле
Да, лучше в .install файле. В том смысле, что будет избирательная загрузка тела кода хука только на операциях инсталляции/обновления. Ещё избирательнее - перетащить тело хука hook_update_N в отдельный статический метод какого-нить уникального класса вроде HookUpdateN. Особенно если хуков hook_update_N будет много - для каждого можно запилить отдельный класс с единственным статическим методом. Это ну прям вообще песня.![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)