Próbowałem dodać kolumnę do tabeli, ale uzyskałem zaskakujący efekt z klauzulą DEFAULT. W tabeli z istniejących wierszy, dodałem nową kolumnę tak:Czy wartości domyślne są obsługiwane w Oracle dla kolumn z semantyką char?
alter table t add c char(1 char) default 'N' not null;
Kiedy następnie dodaje ograniczenie wyboru do stołu, to nie powiodło się:
alter table t add constraint chk check(c in ('N', 'Y'));
co spowodowało
ERROR at line 1:
ORA-02293: cannot validate (T.CHK) - check constraint violated.
Inne info:
- Bo Ustawiam jednostki jawnie (tj. Char (1 znak) w przeciwieństwie do znaku char (1)), nie oczekuję, że wartość nls_length_semanatics będzie istotna.
- Po dodaniu kolumny jako char (1 znak) nowo dodane litery "N" są w rzeczywistości "N" i nie jestem pewien, co to jest dodatkowy odstęp.
- Dodanie kolumny jako char (1 bajt) działa zgodnie z oczekiwaniami;
- Dodanie kolumny bez "domyślnego" N "nie zerowego", po której następuje aktualizacja wszystkich istniejących wierszy do "N", a następnie zmiana kolumny na "niezerowa" również działa zgodnie z oczekiwaniami.
- NLS_CHARACTERSET to AL32UTF8, ale nie spodziewam się, że będzie to istotne.
- Baza danych to Oracle 11g; 11.2.0.1.0.
Dzięki.
jeśli tylko wartości mają być „N” lub „Y” , dlaczego nie zrobić (1 bajt)? – tbone
Spróbuj przepisać ograniczenie sprawdzające jako 'CHECK (C IN (TO_NCHAR (" N '), TO_NCHAR ("Y')))". Nie jestem pewien, czy wywołania funkcji są dozwolone w ograniczeniach sprawdzania, ale może to być przynajmniej warte strzału. –