Update mit MySQL-Statement schlägt fehl

  • Ich habe eine Update-Anweisung zu einer Tabellespalte geschrieben. Diese wird in MyPHPAdmin ohne Probleme ausgeführt, doch im WCF kommt folgende Fehlermeldung:



    Die Tabelle bzw. die Spalte sieht vor dem Update so aus bzw. wurde so angelegt:


    ALTER TABLE wcf1_user ADD userIPLogComment TEXT ;


    und mit dem Update der Paket-Version wollte ich dieses ausführen, dann kommt aber der besagte Fehler...


    ALTER TABLE `wcf1_user` CHANGE `userIPLogComment` `userIPLogComment` MEDIUMTEXT ;


    Warum macht er denn eine Fehlermeldung?

  • Also ich hätte das so geschrieben: ALTER TABLE wcf1_user MODIFY COLUMN userIPLogComment MEDIUMTEXT; den "CHANGE" kenne ich eigentlich nur, wenn man eine Spalte umbenennen will.

    • Official Post

    MDMAN Der Parser sucht nach CHANGE COLUMN.

    SQL
    ALTER TABLE wcf1_user CHANGE COLUMN userIPLogComment userIPLogComment MEDIUMTEXT;

    Barungar MODIFY COLUMN wird von uns nicht unterstützt, da es redundant zu CHANGE COLUMN ist, bzw. sich nur durch die optionale Umbenennung unterscheidet.

  • Au Man... so langsam drehe ich durch...


    Jetzt das nächste Problem.


    Wenn ich diese Anweisung:


    ALTER TABLE wcf1_user_iplog_all_user CHANGE COLUMN IPv4 IPv4 VARCHAR(39) NULL DEFAULT NULL, CHANGE COLUMN IPv6 IPv6 VARCHAR(39) NULL DEFAULT NULL, CHANGE COLUMN userID userID INT(10) NULL;

    ausführen möchte, bekomme ich den MySQL-Fehler: "userID can't be NULL" oder so ungefähr.


    Aber wenn ich diese Anweisung dann direkt in PHPmyAdmin eingebe, geht es ohne Probleme.


    Was ist denn nun schon wieder hier falsch?


    Es gibt natürlich einige Änderungen an der Datenbank und an den vorhandenen Daten, darum wurde auch ein PIP geschrieben, der es dann entsprechend bearbeiten soll, aber bevor das PIP ausgeführt wird soll durch eine SQL-Anweisung die Datenbank unter anderen wie oben geändert werden. Doch da hakt es schon... Einer eine Idee oder kann mir da einer mal gerade helfen?

  • So langsam drehe ich hier echt am Rad...


    Jetzt kommt folgender Fehler:


    Code
    Datum: 20. Juli 2017, 12:43
    Datei (Zeile): /var/www/vhosts/mdman.de/dev.mdman.de/wcf/lib/system/database/statement/PreparedStatement.class.php (97)
    Aufgerufene URL: /acp/index.php?install-package/&t=bfe2159a1c39510e0daf2395ca97b12a970b404b&s=841a764c5412bb937df49e616f443bc4d0663f9f
    Referrer: http://dev.mdman.de/acp/index.php?package-installation-confirm/&queueID=40&s=841a764c5412bb937df49e616f443bc4d0663f9f
    Browser: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
    Zusatzinformationen: sql type: wcf\system\database\MySQLDatabase
    sql error: Cannot add or update a child row: a foreign key constraint fails ("mdman_dev_mdman_de"."#sql-541_72da9c", CONSTRAINT "281606e1897873b788c05ad9ebc20e6a_fk" FOREIGN KEY ("doubleUserID") REFERENCES "wcf1_user" ("userID") ON DELETE SET NULL)
    sql error number: 23000
    sql version: 5.5.55-0ubuntu0.14.04.1
    sql query: ALTER TABLE `wcf1_user_iplog_double_accounts` ADD CONSTRAINT `281606e1897873b788c05ad9ebc20e6a_fk` FOREIGN KEY (`doubleUserID`) REFERENCES `wcf1_user` (`userID`) ON DELETE SET NULL

    Ich geb es gleich auf mit diesen blöden ForeignKeys...

    • Official Post

    Bei FOREIGN KEY müssen beide Spalten miteinander kompatibel sein, d.h. eine identische Definition besitzen. wcf1_user.userID darf nicht NULL sein, die Spalte in deiner Tabelle jedoch schon. Entweder gleichst du die Definition an, oder du kannst den FOREIGN KEY nicht verwenden.


    In deiner Tabelle stehen Werte für userID drin, die es in wcf1_user nicht gibt. Unmittelbar bevor du den FOREIGN KEY anlegst, musst du die Werte einmalig abgleichen lassen:

    SQL
    UPDATE wcf1_user_iplog_double_accounts SET doubleUserID = NULL WHERE doubleUserID NOT IN (SELECT userID FROM wcf_user);
    • Official Post

    Und dann ist es auch egal, welche Struktur die Datenbanken haben? Also ob bei einer NULL stehen darf und bei der anderen Nicht`?

    Ja, die Spalten müssen nur hinsichtlich ihrer Definition von Typ und Breite übereinstimmen. Konkret für die userID-Spalte bedeutet das: Beide Spalten müssen als INT(10) definiert sein. NULL spielt hier keine Rolle, ich hatte mich bei meiner ursprünglichen Aussage vertan.

  • mmm...


    Jetzt habe ich schon wieder ein Problem mit einer SQL-Anweisung... siehe mal hier:


    ALTER TABLE `XXXXXXX_product` CHANGE COLUMN `title` `title` VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';


    Ich dachte es muss jetzt CHANGE COLUMN heißen? Aber egal was ich da eingebe, dieser es kommt immer wieder der Fehler

    "unsupported SQL Statement"...


    Kann mir da noch einer helfen uns sagen, wo hier das Problem liegt?!?

  • Sicher:


Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!