fix: for wrong primary key
... | ... | @@ -222,6 +222,25 @@ public static function onPackageSetup(QUI\Package\Package $Package) |
return; | ||
} | ||
// unique bricks cache patch | ||
$projects = QUI::getProjectManager()->getProjectList(); | ||
foreach ($projects as $Project) { | ||
$projectCacheTable = QUI::getDBProjectTableName( | ||
Manager::TABLE_CACHE, | ||
$Project | ||
); | ||
try { | ||
QUI::getDataBase()->fetchSQL( | ||
"`ALTER TABLE ``{$projectCacheTable}`` DROP PRIMARY KEY;`" | ||
|
||
); | ||
} catch (QUI\Exception $Exception) { | ||
QUI\System\Log::addInfo($Exception->getMessage()); | ||
} | ||
} | ||
// unique id patch | ||
$php = 'php'; | ||
if (\defined('PHP_BINARY')) { | ||
... | ... |
-
Jein, mein Fix sorgt zumindest dafür, dass der Fehler
INFO - SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`ALTER TABLE ``Mainproject_de_bricksCache`` DROP PRIMARY KEY;`' at line 1`ALTER TABLE ``Mainproject_de_bricksCache`` DROP PRIMARY KEY;`
verschwindet. Er korrigiert also die fehlerhafte Syntax. In meiner Antwort oben habe ich glaube ich die falsche Fehlermeldung kopiert. Die Meldung, die danach erscheint ist folgende:
Syntax error or access violation: 1091 Can't DROP 'PRIMARY'; check that column/key existsALTER TABLE `Mainproject_de_bricksCache` DROP PRIMARY KEY;
-
Mein Ansatz einer Query/Procedure, die den PK nur dann entfernt, wenn es einen gibt funktioniert so nicht, da Tabellennamen nicht aus Parametern kommen können:
DELIMITER // DROP PROCEDURE IF EXISTS drop_primary_key_if_exists // CREATE PROCEDURE drop_primary_key_if_exists(table_name_param VARCHAR(255)) BEGIN IF EXISTS( SELECT constraint_name FROM information_schema.table_constraints WHERE table_name = table_name_param AND constraint_name = 'PRIMARY' ) THEN ALTER TABLE table_name_param DROP PRIMARY KEY; END IF; END // DELIMITER ; CALL drop_primary_key_if_exists('feeds');
Es wird also notwendig sein per PHP erst zu schauen ob die Tabelle einen PK hat. Das Ergebnis der nachfolgenden Query ist 1, wenn ein PK in der Tabelle
my_table
existiert.SELECT COUNT(constraint_name) FROM information_schema.table_constraints WHERE table_name = `my_table` AND constraint_name = 'PRIMARY'
Anschließend kann die nachfolgende Query ausgeführt werden, um den PK zu entfernen:
ALTER TABLE table_name_param DROP PRIMARY KEY;
-
mentioned in merge request !8 (merged)