2012-09-03 17 views
14

W wielu smakach SQL istnieją trzy sposoby niejawnego ustawienia kolumny na wartość NULL przy każdym wstawieniu wiersza. SąKolumny MySQL z domyślnym null - wyborem stylistycznym, czy też?

columnname type NULL 
columnname type DEFAULT NULL 
columnname type NULL DEFAULT NULL 

czyli pierwsza ustawia flagę NULL (w przeciwieństwie do not null), drugi pozostawia flagę NULL do wartości domyślnej, a trzeci ustawia flagę NULL i ustawia wartość niejawnego jako ZERO.

Słyszałem o tym, jak w Microsoft SQL, druga odmiana nie jest dokładnie taka sama, ponieważ można również dostosować domyślną wartość flagi NULL dla tabel lub schematów.

Jednak dla MySQL nie sądzę, że istnieje taka funkcja. Ponadto w MySQL kolumny z flagą NULL, w odróżnieniu od kolumn NOT NULL, zawsze są domyślnie ustawione na wartość NULL na insert, jeśli nie ma jawnej wartości, nawet jeśli włączony jest tryb ścisły. Pozostawia to wszystkie te deklaracje kolumn identyczne.

W moim skrypcie MySQL, dla każdej kolumny NOT NULL, określam wartość DEFAULT dla kolumn, których nie oczekuję w niektórych wstawkach w mojej aplikacji, aby uniknąć problemów, gdybym włączał tryb ścisły. Dlatego uważam, że byłbym bardziej symetryczny, gdybym wybrał trzecią odmianę, mimo że jest ona najbardziej gadatliwa i jednoznaczna. Czy deklaracje takie jak trzecia zmiana są częste, czy pierwsza czy druga odmiana występuje częściej w skryptach innych osób?

Zastanawiam się, przechylając się do drugiego podejścia, ponieważ jest to alias, którego używa zrzut MySQL, ale nie jestem pewien, czy to dobry pomysł, ponieważ zrzuca on również liczby całkowite jako ciągi (pojedyncze cudzysłowy) w klauzulach domyślnych deklaracji kolumn. .

To pytanie może wydawać się być bardziej opiniotwórcze niż takie, które ma rozwiązanie, ale chcę też mieć świadomość potencjalnych problemów, których nie jestem świadomy. Mogę zdecydować się na migrację z MySQL do PostgreSQL w przyszłości, a także mogę skorzystać z porady tych ekspertów, np. jeśli PostgreSQL rozróżnia te przypadki, tak jak robi to MS-SQL. Popraw mnie, jeśli się mylę, jeśli podałem nieprawidłowe założenia.

+1

Nie jestem pewien, czy jesteś świadomy, ale w MySQL możesz ustawić domyślną wartość (która nie jest pusta) dla kolumny z zerowością. Jeśli nie podasz wartości dla tej kolumny podczas wstawiania, kolumna ma wartość domyślną. Można również jawnie określić, że należy wstawić wartość null, w którym to przypadku kolumna ma wartość null. Na przykład możesz określić kolumnę jako "SMALLINT DEFAULT 3". Następnie, jeśli jawnie wstawisz niepustą wartość całkowitą, przechowuje ona tę wartość; jeśli wstawisz null jawnie, przechowuje on wartość null; a jeśli nie określisz wartości podczas wstawiania, to zapisze 3, wartość domyślną. – Hammerite

+0

tak! Martwię się tylko o kolumny, które mają domyślną wartość null. –

+0

Być może to pytanie jest bardziej odpowiednie dla [programmer.se]? – eggyal

Odpowiedz

9

Każda baza danych, którą spotkałem, traktuje NULL w sposób, w jaki je opisujesz. Gdy kolumna przyjmuje wartości NULL, wtedy podanie wartości INSERT nie powoduje wartości NULL. Uważam, że jest to część standardowego zachowania ANSI.

Co do określenia samego "NULL". To kwestia preferencji. Standard mówi, że kolumna dopuszcza wartości NULL , chyba że podano NOT NULL (na poziomie języka definicji danych). Tak, sam jest NULL zbędnymi, i masz, czwartą równoważną opcję:

columnname type 

wartości null są dość osadzony w języku SQL za pomocą standardu ANSI. Twoja trzecia opcja jest najbardziej jednoznaczna, ale także wygląda trochę nietypowo.

Jeśli planujesz być super konsekwentny w całym systemie, to podążę ścieżką, na której jesteś. Każda kolumna w każdej tabeli ma wartość NULL lub NOT NULL. Dla wszystkich kolumn, które przyjmują wartości domyślne, należy użyć instrukcji DEFAULT.

Nie należy jednak oczekiwać, że inne osoby, z którymi pracujesz (teraz lub w przyszłości), chętnie zastosują się do tego przykładu. Wielu wolałoby czwartą opcję w tym przypadku tylko dlatego, że wymaga mniej pisania i jak zachowują się wszystkie (lub prawie wszystkie) dialekty SQL.

+0

Tak. Prawie nikt nie pisze jawnego "SELECT ALL", ale używa niejawnego (i równoważnego) 'SELECT'. –

+0

Chociaż eggyal miał świetne punkty (i odniesienie do dokumentacji MySQL), twoje dane jasno pokazały, że był to standard SQL, a nie tylko MySQL. Ponieważ jestem przekonany, że nie będę musiał powracać do tej konkretnej części definicji kolumn, gdybym miał zmienić systemy baz danych, a większość powinna wiedzieć o niejawnych modyfikatorach, pozostanę przy najbardziej zwięzłym aliasie, który podałeś. Dziękuję Ci! –

18

Jak wykazano poniżej Data Type Default Values:

przypadku kolumna może NULL jako wartość kolumna jest zdefiniowana wyraźnego DEFAULT NULL punktu.

(myślę, że oznaczało niejawny, nie wyraźny).

Ponadto, jak wykazano na podstawie CREATE TABLE Syntax:

Jeśli nie NULL ani NOT NULL określona kolumna jest traktowany tak, jakby NULL została określona.

Dlatego w MySQL następujące definicje kolumn są identyczne:

columnname type 
columnname type NULL 
columnname type DEFAULT NULL 
columnname type NULL DEFAULT NULL 

Wybór których użycie jest równowaga pomiędzy byciem jawne, i jest zwięzły. W zależności od okoliczności mogę użyć dowolnego z powyższych.

+2

Należy zauważyć, że istnieje typ krawędzi z typem "TIMESTAMP". Jeśli twoja kolumna jest zadeklarowana jako 'pieczęć TIMESTAMP', i robisz INSERT bez podania wartości dla' pieczęć', to domyślnie będzie to INSERTing z wartością bieżącej datetime UTC. Jeśli zadeklarujesz kolumnę jako 'znacznik TIMESTAMP NULL', to INSERT będzie domyślnie wartością NULL. – user2426679