Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: usuwanie/modyfikacja UNIQUE KEY
Forum PHP.pl > Forum > Bazy danych > MySQL
mihmih
witam,

mam w tej chwili na jednej tabeli UNIQUE KEY składający się z 4 kolumn. To znaczy że w tabeli nie mogą się powtarzać rekordy o tych samych wartościach we wszystkich 4 kolumnach. Teraz chciałbym dodać piątą kolumnę do tego zestawu. Czy jest możliwa modyfikacja takiego UNIQUE KEY ?

Jeśli nie to chciałem usunąć UNIQUE KEY i dodać nowy, już z 5 kolumnami. Ale przy próbie usunięcia:

  1. ALTER TABLE tbl_name
  2. DROP INDEX index_name;


wyskakuje mi błąd - nie może mi go usunąć przez klucze obce. Czy to znaczy że najpierw muszę usunąć klucze obce w tej tabeli? A co wtedy z relacjami łączonymi tą tabele z innymi?

po wpisaniu komendy SHOW CREATE TABLE pozycje_zakupowe otrzymałem:

  1. 'pozycje_zakupowe', 'CREATE TABLE `pozycje_zakupowe` (\n
  2. `ID_poz_zakupowej` int(10) NOT NULL AUTO_INCREMENT,\n
  3. `ID_rodzaju_poz_zak` int(10) NOT NULL,\n
  4. `wymiar` varchar(100) NOT NULL,\n
  5. `ID_jednostki_zak` int(10) NOT NULL,\n
  6. `indeks_sprzedajacego` varchar(100) DEFAULT NULL,\n
  7. `uwagi` varchar(100) DEFAULT NULL,\n
  8. `ID_sprzedajacego` int(10) NOT NULL,\n
  9. `ID_materialu` int(10) DEFAULT NULL,\n
  10. `przelicznik` decimal(65,5) NOT NULL,\n
  11. `ID_waluty` int(10) NOT NULL,\n
  12. `kto_dodal` varchar(100) DEFAULT NULL,\n
  13. `kto_zmienil` varchar(100) DEFAULT NULL,\n
  14. `waga_pozycji` decimal(65,2) DEFAULT NULL,\n
  15. `ID_jednostki_zam` int(10) NOT NULL,\n
  16. `modifiedtime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,\n
  17. `createdtime` datetime DEFAULT CURRENT_TIMESTAMP,\n
  18. `magazyn` bit(1) DEFAULT NULL,\n
  19. PRIMARY KEY (`ID_poz_zakupowej`),\n
  20. UNIQUE KEY `unique_index` (`ID_rodzaju_poz_zak`,`wymiar`,`ID_sprzedajacego`,`ID_materialu`),\n
  21. KEY `ID_jednostki_zak` (`ID_jednostki_zak`),\n
  22. KEY `ID_sprzedajacego` (`ID_sprzedajacego`),\n
  23. KEY `ID_materialu` (`ID_materialu`),\n
  24. KEY `ID_waluty` (`ID_waluty`),\n
  25. CONSTRAINT `pozycje_zakupowe_ibfk_2` FOREIGN KEY (`ID_jednostki_zak`) REFERENCES `jednostki` (`ID_jednostki`),\n
  26. CONSTRAINT `pozycje_zakupowe_ibfk_3` FOREIGN KEY (`ID_rodzaju_poz_zak`) REFERENCES `rodzaje_pozycji_zakupowych` (`ID_rodzaju_pozycji_zakupowej`),\n
  27. CONSTRAINT `pozycje_zakupowe_ibfk_4` FOREIGN KEY (`ID_sprzedajacego`) REFERENCES `zamawiajacy` (`ID_zamawiajacego`),\n
  28. CONSTRAINT `pozycje_zakupowe_ibfk_5` FOREIGN KEY (`ID_materialu`) REFERENCES `gatunki_materialow` (`ID_gatunku_materialu`),\n
  29. CONSTRAINT `pozycje_zakupowe_ibfk_6` FOREIGN KEY (`ID_waluty`) REFERENCES `waluty` (`ID_waluty`)\n
  30. ) ENGINE=InnoDB AUTO_INCREMENT=244 DEFAULT CHARSET=utf8'


rozumiem że muszę najpierw usunąć klucze obce o nazwach:

`pozycje_zakupowe_ibfk_2-6` tak? Potem usunąć UNIQUE KEY i nadać CONSTRAINTY wszystkie jeszcze raz? No i zastanawiam się czym są komendy KEY? Co wprowadzają te 4 linie do mojej tabeli?

Bedę wdzięczny za każdą pomoc.
Pyton_000
Spróbuj

  1. SET FOREIGN_KEY_CHECKS=0;
  2. ALTER TABLE pozycje_zakupowe DROP INDEX unique_index;
  3. ALTER TABLE ADD UNIQUE INDEX unique_index (`ID_rodzaju_poz_zak`,`wymiar`,`ID_sprzedajacego`,`ID_materialu`, `DDDDD`);
  4. SET FOREIGN_KEY_CHECKS=1;


A jak nie to usuń tylko `pozycje_zakupowe_ibfk_3`

PS. BACKUP!
mihmih
dzięki za odpowiedź.

Nie brakuje czasami w tym twoim poleceniu usunięcia starego UNIQUE KEY? Chyba że któryś wiersz z tego polecenia to robi.... Bo nawet jeśli dodam ten nowy, to stary nie pozwoli mi wprowadzać rekordów o 4 takich samym kolumnach, a piątej różnej. I jeśli to nie problem, to co oznaczają te 4 polecenie zaczynające się od KEY?

nie zabrakło ci w 2 wierszu czasami DROP? wtedy wszystko by sie zgadzało.
Pyton_000
Poprawiłem bo zgubiłem słówko Drop.

KEY to po prostu indeksy stworzone na potrzeby FK
mihmih
a to dlaczego takich indeksów mam 4, a FK mam 5? Może to głupie pytanie, ale cieszę się że pojawił mi się taki problem, bo zawsze tworzyłem tabelę poprzez edytor, teraz wiem jak to wygląda od strony wiersza poleceń.

I jeszzcze jedno pytanie jeśli mozna, co oznacza w ostatnim wierszu tworzenia tabeli:

  1. ENGINE=InnoDB AUTO_INCREMENT=244 DEFAULT CHARSET=utf8'


wyrażenie AUTO_INCREMENT=244 DEFAULT?



niestety przypróbie wpisania twojego polecenia mam błąd:

1: 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 pozycje_zakupowe DROP INDEX unique_index;
ALTER TABLE ADD UNIQUE IND' at line 2

Oczywiście zamieniłem DDDDD na właściwa kolumnę....
Pyton_000
4 ponieważ jako 5 index uzyty został właśnie UNIQUE (pierwsza kolumna w indeksie)

AUTO_INCREMENT=244 - oznacza kolejny numer dla kolumny która ma nadany atrybut auto_increment
DEFAULT CHARSET=utf8 - to chyba jasne.

  1. SET FOREIGN_KEY_CHECKS=0;
  2. DROP INDEX unique_index ON pozycje_zakupowe;
  3. ALTER TABLE ADD UNIQUE INDEX unique_index (`ID_rodzaju_poz_zak`,`wymiar`,`ID_sprzedajacego`,`ID_materialu`, `DDDDD`);
  4. SET FOREIGN_KEY_CHECKS=1;
mihmih
dzięki za wyjaśnienia.

Tym razem następujący błąd:

1: 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 'DROP INDEX unique_index ON pozycje_zakupowe;
ALTER TABLE ADD UNIQUE INDEX unique' at line 2

zatem pozostało mi chyba tylko usunięcie FK....
nospor
Gdzie ty odpalasz to zapytanie? Bo chyba nie chcesz powiedziec ze w php jako jedno query?
mihmih
nie, nie. Ja mam połączony moduł Base programu Libreoffice poprzez JDBC z Mysqlem. I jest tu możliwość wydawania komend bezpośrednio do MySqla. Nigdy nie miałem z tym problemu, więc to chyba nie wina tego że nie robię tego w Mysqlu. Juz wiele razy wykonywałem tak polecenie ALTEr TABLE, DROP, MODIFY itd i zawsze wszystko działało. Mysql jest niestety na serwerze, gdzie nie mam dostępu.
nospor
Ale tu masz kilka zapytan a nie jedno. Jesli ty te kilka zapytan slesz jako jedno, to nic dziwnego ze sie wykrzacza
mihmih
działa, wielkie dzięki!. Musiałem jedynie dodać nazwę tabeli do 3 polecenia. Jeszcze raz dziękuję.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.