2013-05-08 11 views
5

Próbuję zmienić istniejącą kolumnę w tabeli Muszę zezwolić na wartości puste, a następnie ustawić wartość domyślną na wartość null. Próbowałem uruchomić następujące czynności, ale nie wydaje się, aby zaktualizować tabelę:ALTER TABLE nie pozwala ustawić wartości NULL lub domyślnej?

mysql> ALTER TABLE answers_form MODIFY sub_id int unsigned NULL DEFAULT NULL; 
Query OK, 0 rows affected (0.00 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> desc answers_form; 
+--------------+------------------+------+-----+---------+-------+ 
| Field  | Type    | Null | Key | Default | Extra | 
+--------------+------------------+------+-----+---------+-------+ 
| answer_id | int(10) unsigned | NO | PRI | 0  |  | 
| sub_id  | int(10) unsigned | NO | PRI | 0  |  | 
| form_id  | int(10) unsigned | NO | PRI | NULL |  | 
| value  | varchar(255)  | NO |  | NULL |  | 
| non_response | bit(1)   | YES |  | b'0' |  | 
+--------------+------------------+------+-----+---------+-------+ 
5 rows in set (0.01 sec) 

Czy ktoś może zobaczyć, co robię źle tutaj?

+0

Czy to możliwe, że nie można ustawić tej kolumny jako wartości zerowej, ponieważ jest ona częścią klucza podstawowego? –

Odpowiedz

4

jego klucz główny, MySQL nie pozwala częścią klucza pierwotnego być null, która robi fakt, że pozwala ona domyślną wartość zerową dla form_id nieparzystych jednak docs na

http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

powiedzieć "wydajność kwerendy korzyści z optymalizacji NOT NULL, ponieważ nie może zawierać żadnych wartości NULL".

Po prostu z czystej ciekawości, czy rzeczywiście pozwala umieścić wartości null w polu form_id?

+0

Możesz po prostu zrobić małe [skrzypce] (http: // sqlfiddle.com) i przekonaj się sam. – hd1

+0

Dałem temu szansę i nie mogłem wstawić wartości zerowej. Zgaduję, że najlepiej jest użyć w tym przypadku klucza unikatowego zamiast klucza podstawowego? –

+0

ok, przynajmniej zachowanie jest zgodne z dokumentacją, nawet jeśli wynik działania desc jest mylący. I tak, unikalny klucz, może nawet smaczniejszy, wprowadza dwie nowe tabele do dołączenia :) Na przykład SUB_ASSOC (answer_id, sub_id) i FORM_ASSOC (answer_id, sub_id). Następnie możesz zrobić dwa LEFT JOINs na tych tabelach i mieć zwrócone NULLS, jeśli nic nie istnieje (bez zapełniania bazy danych denerwującymi zerami :) NIE mam NULL ocd lol) – JustDanyul

1

Masz 2 kolumny nieululowane z domyślną wartością null. To nie powinno być dozwolone przez silnik bazy danych. Jeśli tak, to raczej daleko do najlepszej praktyki.

+0

'form_id' jest kolumną zerową i jest częścią klucza podstawowego ... –

+0

@Abe, dodałem kilka dodatkowych informacji do mojej odpowiedzi na temat kolumny Non nullable z wartością domyślną" NULL ". – MichaelJCox

1

sub_id jest wymieniony jako klucz podstawowy

od MySQL docs (5,7, ale inne wersje mówią to samo):

klucz podstawowy jest unikatowy indeks, gdzie wszystkie kolumny klucza muszą być zdefiniowane jako NIE NULL. Jeśli nie są jawnie zadeklarowane jako NOT NULL, MySQL deklaruje je tak niejawnie (i cicho).

Co do dyskusji na temat niezerowe kolumn o domyślnej NULL ...

Wartość w kolumnie DefaultNULL oznacza, że ​​nie ma domyślnego, nie że domyślnie jest NULL.

Fiddle: http://sqlfiddle.com/#!2/c718d/1

Jeśli utworzyć prosty stół tak:

CREATE TABLE name_num(
    Number INT PRIMARY KEY, 
    Name TEXT NOT NULL 
); 

a następnie wykonaj desc name_num, otrzymuję:

| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | 
--------------------------------------------------- 
| Number | int(11) | NO | PRI | (null) |  | 
| Name | text | NO |  | (null) |  | 

Znowu z MySQL docs:

Jeśli kolumna nie może przyjąć wartości NULL jako wartości, MySQL definiuje kolumnę bez jawnej klauzuli DEFAULT. Wyjątek: jeśli kolumna jest zdefiniowana jako część klucza PRIMARY, ale nie jawnie jako NOT NULL, MySQL tworzy ją jako kolumnę NOT NULL (ponieważ kolumny PRIMARY KEY muszą mieć wartość NOT NULL), ale również przypisuje ją klauzulę DEFAULT z domyślnym domyślnym wartość. Aby temu zapobiec, dołącz wyraźną NOT NULL w definicji kolumny PRIMARY KEY.

+0

'form_id' jest kolumną zerową i jest częścią klucza podstawowego ... –

+0

id_formularza nie jest wartością pustą (Null NO), ale ma domyślną wartość NULL. – MichaelJCox

Powiązane problemy