Zmień tabelę MySQL, aby dodać komentarze do kolumn

109

Sprawdzałem dokumentację MySQL pod kątem ALTER TABLE i nie wydaje się, aby zawierała ona sposób dodawania lub modyfikowania komentarza do kolumny. W jaki sposób mogę to zrobić?

-- for table
ALTER TABLE myTable COMMENT 'Hello World'

-- for columns
-- ???
Jhonny D. Cano -Leftware-
źródło

Odpowiedzi:

134

próbować:

 ALTER TABLE `user` CHANGE `id` `id` INT( 11 ) COMMENT 'id of user'  
Rufinus
źródło
12
Wydaje się, że działa dobrze, ale czy istnieje inny sposób na zrobienie tego bez uwzględnienia definicji kolumny?
Jhonny D. Cano -Leftware-
15
To rozwiązanie może zepsuć automatyczne przyrosty.
workdreamer
13
Zwróć uwagę, że zmiana komentarza spowoduje pełną przebudowę tabeli. Możesz więc żyć bez niego przy bardzo dużym stole.
Courtney Miles
2
@MarcusPope to niemożliwe. Zobacz dba.stackexchange.com/questions/78268/…
gaRex
5
@ user2045006 To nie jest (lub już nie) prawda, o ile definicja kolumny dokładnie odpowiada istniejącej definicji. Komentarze można dodawać bez powodowania rekonstrukcji tabeli.
Torben
36

Możesz użyć MODIFY COLUMNdo tego. Po prostu zrób...

ALTER TABLE YourTable
MODIFY COLUMN your_column
your_previous_column_definition COMMENT "Your new comment"

zastępowanie:

  • YourTable z nazwą Twojego stołu
  • your_column z nazwą Twojego komentarza
  • your_previous_column_definitionz kolumną column_definition , którą polecam uzyskać za pomocą SHOW CREATE TABLE YourTablepolecenia i kopiować dosłownie, aby uniknąć pułapek. *
  • Your new comment z odpowiednim komentarzem do kolumny.

Na przykład...

mysql> CREATE TABLE `Example` (
    ->   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   `some_col` varchar(255) DEFAULT NULL,
    ->   PRIMARY KEY (`id`)
    -> );
Query OK, 0 rows affected (0.18 sec)

mysql> ALTER TABLE Example
    -> MODIFY COLUMN `id`
    -> int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Look, I''m a comment!';
Query OK, 0 rows affected (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE Example;
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                                                                                                                                  |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Example | CREATE TABLE `Example` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Look, I''m a comment!',
  `some_col` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

* Za każdym razem, gdy używasz klauzul MODIFYlub CHANGEw ALTER TABLEinstrukcji, sugeruję skopiowanie definicji kolumny z danych wyjściowych SHOW CREATE TABLEinstrukcji. Chroni to Cię przed przypadkową utratą ważnej części definicji kolumny, nie zdając sobie sprawy, że musisz ją uwzględnić w klauzuli MODIFYlub CHANGE. Na przykład, jeśli kolumna, trzeba wyraźnie określić modyfikator ponownie w klauzuli, lub kolumna przestanie być kolumna. Podobnie, jeśli kolumna jest zdefiniowana jako lub ma wartość, te szczegóły muszą zostać uwzględnione podczas wykonywania a lub w kolumnie, w przeciwnym razie zostaną utracone.MODIFYAUTO_INCREMENTAUTO_INCREMENTMODIFYAUTO_INCREMENTNOT NULLDEFAULTMODIFYCHANGE

Mark Amery
źródło
14

Skrypt dla wszystkich pól w bazie danych:

SELECT 
table_name,
column_name,
CONCAT('ALTER TABLE `',
        TABLE_SCHEMA,
        '`.`',
        table_name,
        '` CHANGE `',
        column_name,
        '` `',
        column_name,
        '` ',
        column_type,
        ' ',
        IF(is_nullable = 'YES', '' , 'NOT NULL '),
        IF(column_default IS NOT NULL, concat('DEFAULT ', IF(column_default IN ('CURRENT_TIMESTAMP', 'CURRENT_TIMESTAMP()', 'NULL', 'b\'0\'', 'b\'1\''), column_default, CONCAT('\'',column_default,'\'') ), ' '), ''),
        IF(column_default IS NULL AND is_nullable = 'YES' AND column_key = '' AND column_type = 'timestamp','NULL ', ''),
        IF(column_default IS NULL AND is_nullable = 'YES' AND column_key = '','DEFAULT NULL ', ''),
        extra,
        ' COMMENT \'',
        column_comment,
        '\' ;') as script
FROM
    information_schema.columns
WHERE
    table_schema = 'my_database_name'
ORDER BY table_name , column_name
  1. Eksportuj wszystko do pliku CSV
  2. Otwórz go w swoim ulubionym edytorze csv

Uwaga: jeśli wolisz, możesz ulepszyć tylko do jednej tabeli

Rozwiązanie podane przez @Rufinus jest świetne, ale jeśli masz automatyczne inkrementacje, zepsuje je.

workdreamer
źródło
3
Według nowego użytkownika, który nie ma wystarczającej liczby przedstawicieli do komentowania, dump.aux_comment,musi być column_comment,. Czy mógłbyś sprawdzić, czy to prawda?
nhahtdh
Przepraszam za błąd.
workdreamer
Oczywiście, jeśli masz auto_increment id, musisz to zrobić ALTER TABLE MODIFY id INT NOT NULL AUTO_INCREMENT COMMENT 'id of user';. To nie przerywa automatycznych przyrostów.
mpoletto
@workdreamer Mówiłem o rozwiązaniu Rufinus, o którym mówisz, że może zepsuć automatyczną inkrementację. Nie, podane rozwiązanie go nie psuje.
mpoletto
1
Niesamowite, niesamowite!
Rizki Noor Hidayat Wijaya
4

Schemat informacyjny nie jest odpowiednim miejscem do traktowania tych rzeczy (zobacz polecenia bazy danych DDL).

Dodając komentarz, musisz zmienić strukturę tabeli (komentarze do tabeli).

Z dokumentacji MySQL 5.6:

INFORMACJE_SCHEMA to baza danych w każdej instancji MySQL, miejsce, które przechowuje informacje o wszystkich innych bazach danych, które utrzymuje serwer MySQL. Baza danych INFORMATION_SCHEMA zawiera kilka tabel tylko do odczytu. W rzeczywistości są to widoki, a nie tabele podstawowe, więc nie ma z nimi skojarzonych plików i nie można ustawić dla nich wyzwalaczy. Nie ma również katalogu bazy danych o tej nazwie.

Chociaż można wybrać INFORMATION_SCHEMA jako domyślną bazę danych za pomocą instrukcji USE, można tylko czytać zawartość tabel, a nie wykonywać na nich operacji INSERT, UPDATE ani DELETE.

Rozdział 21 INFORMACJE_SCHEMA Tabele

mpoletto
źródło
-3

Zgodnie z dokumentacją komentarze można dodawać tylko w momencie tworzenia tabeli. Musi więc mieć definicję tabeli. Jeden ze sposobów na zautomatyzowanie tego za pomocą skryptu do czytania definicji i aktualizowania komentarzy.

Odniesienie:

http://cornempire.net/2010/04/15/add-comments-to-column-mysql/

http://bugs.mysql.com/bug.php?id=64439

Nageswara Rao
źródło
2
Ta odpowiedź jest nieprawidłowa (można zaktualizować komentarze po utworzeniu tabeli, nawet jeśli jest to żmudne) i zawiera tylko linki do innych witryn internetowych, więc nie jest przydatna w przypadku odpowiedzi przepełnienia stosu.
Lukas Eder