Menu

#60 CREATE+ALTER - nespravne poradi sloupcu

2.3.2
closed-wont-fix
Common (150)
5
2010-07-15
2010-07-10
Odin
No

Zdravim,
Pri pouziti vygnerovaneho skriptu pro sjednoceni databaze, ulozene procedury vytvori napr. nasledujici dotaz:
ALTER TABLE `mod_calendar_addresses` MODIFY `name` varchar(255) COLLATE utf8_general_ci NOT NULL AFTER `city`, MODIFY `city` varchar(255) COLLATE utf8_general_ci COMMENT 'mesto' AFTER `street`;
Skonci s chybou:
Chyba v dotazu: Unknown column 'city' in 'mod_calendar_addresses'
Ktera je vadna, protoze sloupec mod_calendar_addresses.city existuje. Problem je v tom, ze pri vice MODIFY v jednom ALTER TABLE musi byt sloupce uvedeny v tom poradi ve kterem jsou odkazovany (tj. nemuzu se odkazat na sloupec, ktery potom budu modifikovat). Tedy nasledujici dotaz funguje:

ALTER TABLE `mod_calendar_addresses` MODIFY `city` varchar(255) COLLATE utf8_general_ci COMMENT 'mesto' AFTER `street`, MODIFY `name` varchar(255) COLLATE utf8_general_ci NOT NULL AFTER `city`;

To o tom poradi sloupcu sice v dokumentaci MySQL neni popsane (alespon jsem to nenasel), ale funguje to tak. Kazdopadne, vzhledem k tomu, ze vice MODIFY v jenom ALTER TABLE je rozsireni mysql, tak jedno z reseni by asi bylo mit pro kazdy MODIFY vlastni ALTER.

5.1.48-community přes PHP extenzi MySQLi

Odin.

Discussion

  • Odin

    Odin - 2010-07-10

    + definice tabulky pro uvedene dotazy

    CREATE TABLE `mod_calendar_addresses` (
    `id` int(4) unsigned NOT NULL AUTO_INCREMENT,
    `number` varchar(20) DEFAULT NULL,
    `street` varchar(255) DEFAULT NULL,
    `city` varchar(255) DEFAULT NULL COMMENT 'mesto',
    `name` varchar(255) NOT NULL,
    `caption` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `name` (`name`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

     
  • Jakub Vrána

    Jakub Vrána - 2010-07-15

    Více ALTERů by bylo problematických u velkých tabulek, protože každý ALTER znamená její kompletní zkopírování, takže by to zbytečně zdržovalo.

     
  • Jakub Vrána

    Jakub Vrána - 2010-07-15
    • status: open --> closed-wont-fix
     
  • Jakub Vrána

    Jakub Vrána - 2010-07-15

    K uvedené situaci nejspíš dojde při změně pořadí sloupců v tabulce. Sloupce by se tedy musely procházet v novém pořadí odzadu, což by bylo příliš komplikované (teď se prochází ve starém pořadí zepředu).

    Lepší by to bylo vyřešit přímo v MySQL, zkus najít, jestli je na to bug, případně ho založit.

     

Log in to post a comment.