🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi.bazy-danych
9 messages
9 total messages Started by bunias80 Wed, 26 Nov 2014 08:31
Firebird - dodawanie pola not null z wartością domyślną
#82412
Author: bunias80
Date: Wed, 26 Nov 2014 08:31
15 lines
1978 bytes
Czy ktoś stosuje takie zabiegi:
alter table Adventures add id int default -1 not null ?

wg. dokumentacji pole powinno się dodać i zrobić się "update" wszystkich rekordów na wartość -1. I ogólnie tak to działa. Jak sprawdzałem to pola mają wartość z default.

Niestety ostatnio po taki dodaniu pola przy backup mam błąd:
SQLCode: -625
IBErrorCode: 335544347
Komunikat błędu: "validation error for column IDWYNIK, value "*** null ***""

Wynika jakby jednak update się nie zrobił. 
Czy jedynym rozwiązaniem jest dodawanie:
update Adventures set id = -1 where id is null

zawsze tak to robicie? Czy może większość liczy na tego default'a?
Re: Firebird - dodawanie pola not null z wartością domyślną
#82413
Author: Tomek D
Date: Wed, 26 Nov 2014 10:03
33 lines
2199 bytes
W dniu 2014-11-26 09:31, bunias80@gmail.com pisze:
> Czy ktoś stosuje takie zabiegi: alter table Adventures add id int
> default -1 not null ?

Stosuje

>
> wg. dokumentacji pole powinno się dodać i zrobić się "update"
> wszystkich rekordów na wartość -1. I ogólnie tak to działa. Jak
> sprawdzałem to pola mają wartość z default.

Z moich doświadczeń wynika, że nie działa (nie wiem co pisze na ten 
temat w dokumentacji). Chyba, że korzystasz z narzędzia typu IBExpert, 
który robi update pola po jego dodaniu.

>
> Niestety ostatnio po taki dodaniu pola przy backup mam błąd: SQLCode:
> -625 IBErrorCode: 335544347 Komunikat błędu: "validation error for
> column IDWYNIK, value "*** null ***""
>
> Wynika jakby jednak update się nie zrobił. Czy jedynym rozwiązaniem
> jest dodawanie: update Adventures set id = -1 where id is null
>
> zawsze tak to robicie? Czy może większość liczy na tego default'a?
>

Zawsze robię w takiej sytuacji update. To daje pewność zwłaszcza w 
wypadkach gdy trzeba powielić zmianę na wielu bazach.

Jak się o tym zapomni to problem potrafi się objawić np. dopiero gdy 
będziemy chcieli odtworzyć backup bazy.

Tomek D.
Re: Firebird - dodawanie pola not null z wartością domyślną
#82414
Author: bunias80
Date: Wed, 26 Nov 2014 14:08
13 lines
2000 bytes
W dniu środa, 26 listopada 2014 11:03:43 UTC+1 użytkownik Tomek D napisał:

> Zawsze robię w takiej sytuacji update. To daje pewność zwłaszcza w 
> wypadkach gdy trzeba powielić zmianę na wielu bazach.
> 
> Jak się o tym zapomni to problem potrafi się objawić np. dopiero gdy 
> będziemy chcieli odtworzyć backup bazy.
> 

No tylko to nie jest rozwiązanie. Dzięki "default" mogłem dodać pole w jednej transakcji. Teraz muszę zadbać o to aby skrypt aktualizacyjny po dodaniu kolumny w nowej transakcji zrobił update. 
W moim przypadku aktualizacje robi aplikacja i taki zabieg to komplikuje. 

Dziwne jest to że dodałem tak sporo pól i nie było problemu. Tylko teraz wystąpił.
Re: Firebird - dodawanie pola not null z wartością domyślną
#82415
Author: Tomek D
Date: Wed, 26 Nov 2014 14:23
30 lines
2270 bytes
W dniu 2014-11-26 15:08, bunias80@gmail.com pisze:
> W dniu środa, 26 listopada 2014 11:03:43 UTC+1 użytkownik Tomek D
> napisał:
>
>> Zawsze robię w takiej sytuacji update. To daje pewność zwłaszcza w
>> wypadkach gdy trzeba powielić zmianę na wielu bazach.
>>
>> Jak się o tym zapomni to problem potrafi się objawić np. dopiero
>> gdy będziemy chcieli odtworzyć backup bazy.
>>
>
> No tylko to nie jest rozwiązanie. Dzięki "default" mogłem dodać pole
> w jednej transakcji. Teraz muszę zadbać o to aby skrypt
> aktualizacyjny po dodaniu kolumny w nowej transakcji zrobił update. W
> moim przypadku aktualizacje robi aplikacja i taki zabieg to
> komplikuje.

"default" nie jest rozwiązaniem na wypełnienie nowo dodanego pola zadaną 
wartościa, ale dla zapewnienia wartości jeśli nie zostanie ona jawnie 
wyspecyfikowania w poleceniu INSERT.
Bardzo często przy większych zmianach w bazie konieczne jest rozbicie na 
kilka transakcji, więc mechanizm i tak jest niezbędny.

>
> Dziwne jest to że dodałem tak sporo pól i nie było problemu. Tylko
> teraz wystąpił.

Być może dodawałeś pole do pustej tabeli to problemu nie było.

Tomek D.
Re: Firebird - dodawanie pola not null z wartością domyślną
#82419
Author: Adam Siwoń
Date: Wed, 26 Nov 2014 14:27
25 lines
2311 bytes
W dniu 2014-11-26 15:08, bunias80@gmail.com pisze:
> W dniu środa, 26 listopada 2014 11:03:43 UTC+1 użytkownik Tomek D napisał:
>
>> Zawsze robię w takiej sytuacji update. To daje pewność zwłaszcza w
>> wypadkach gdy trzeba powielić zmianę na wielu bazach.
>>
>> Jak się o tym zapomni to problem potrafi się objawić np. dopiero gdy
>> będziemy chcieli odtworzyć backup bazy.
>>
>
> No tylko to nie jest rozwiązanie. Dzięki "default" mogłem dodać pole w jednej transakcji. Teraz muszę zadbać o to aby skrypt aktualizacyjny po dodaniu kolumny w nowej transakcji zrobił update.
> W moim przypadku aktualizacje robi aplikacja i taki zabieg to komplikuje.
>
> Dziwne jest to że dodałem tak sporo pól i nie było problemu. Tylko teraz wystąpił.
>

A te fragmenty SQLa, które podałeś są wzięte z programu czy wpisane z 
ręki do posta? Może to drobiazg, ale w fragmentach kodu masz 
aktualizację tabeli wykonywaną na polu ID, a komunikat dotyczy IDWYNIK.
Może w momencie aktualizacji ujawnia Ci się po prostu błąd na innym polu 
i stąd problem.

-- 
z pozdrowieniami
Adam Siwoń
Re: Firebird - dodawanie pola not null z wartością domyślną
#82416
Author: bunias80
Date: Wed, 26 Nov 2014 15:03
23 lines
2306 bytes
W dniu środa, 26 listopada 2014 15:23:47 UTC+1 użytkownik Tomek D napisał:

> "default" nie jest rozwiązaniem na wypełnienie nowo dodanego pola zadaną 
> wartościa, ale dla zapewnienia wartości jeśli nie zostanie ona jawnie 
> wyspecyfikowania w poleceniu INSERT.

fragment z dokumentacji 
"    alter table Adventures add id int default -1 not null

Default values are normally not applied when adding fields to existing rows, but with NOT NULL fields they are. 

"
więc chyba jednak jest

> Bardzo często przy większych zmianach w bazie konieczne jest rozbicie na 
> kilka transakcji, więc mechanizm i tak jest niezbędny.

Tutaj tematem nie jest jak zrobić aktualizację tylko czy ktoś stosuje samo add not null default.... i mu to działa czy może to jednak babol FB

> 
> Być może dodawałeś pole do pustej tabeli to problemu nie było.

Nie....nawet kilkadziesiąt tyś. rekordów.
Re: Firebird - dodawanie pola not null z wartością domyślną
#82420
Author: bunias80
Date: Wed, 26 Nov 2014 15:05
12 lines
2019 bytes
W dniu środa, 26 listopada 2014 15:27:58 UTC+1 użytkownik Adam Siwoń napisał:

> 
> A te fragmenty SQLa, które podałeś są wzięte z programu czy wpisane z 
> ręki do posta? Może to drobiazg, ale w fragmentach kodu masz 
> aktualizację tabeli wykonywaną na polu ID, a komunikat dotyczy IDWYNIK.
> Może w momencie aktualizacji ujawnia Ci się po prostu błąd na innym polu 
> i stąd problem.
> 

dodanie pola było przykładem z dokumentacji. Błąd zacytowałem jaki mam u siebie na bazie. stąd rozjazd z nazwami. 
Pole IDWYNIK dodaje dokładnie tak jak to w przykładzie tylko do innej tabeli :)
Re: Firebird - dodawanie pola not null z wartością domyślną
#82417
Author: wloochacz
Date: Wed, 26 Nov 2014 15:36
41 lines
2947 bytes
W dniu 2014-11-26 16:03, bunias80@gmail.com pisze:
> W dniu środa, 26 listopada 2014 15:23:47 UTC+1 użytkownik Tomek D napisał:
>
>> "default" nie jest rozwiązaniem na wypełnienie nowo dodanego pola zadaną
>> wartościa, ale dla zapewnienia wartości jeśli nie zostanie ona jawnie
>> wyspecyfikowania w poleceniu INSERT.
I UPDATE takoż, a dokładnie - jeśli pole z wartością domyślną zostanie 
pominięte przy operacjach DML, to zostanie tam wsadzona wartość domyślna.

> fragment z dokumentacji
> "    alter table Adventures add id int default -1 not null
>
> Default values are normally not applied when adding fields to existing rows, but with NOT NULL fields they are.
>
> "
> więc chyba jednak jest
I tak powinno to zadziałać; a więc, jeśli robisz ADD FIELD NOT NULL with 
DEFAULT, to przy dodaniu tego nowego pola do tabeli jego wartość powinna 
zostać automatycznie ustalona tym, co zostało określone jako wartość 
domyślna. Ale to zadziała tylko i wyłącznie wtedy, kiedy od razu nadasz 
ograniczenie NOT NULL.

A jeśli zrobiłeś tak:
1) Dodaj nowe pole z wartością domyślną
2) Druga operacja - nadanie ograniczenia not null
To efekt będzie taki, jak opisujesz.


>> Bardzo często przy większych zmianach w bazie konieczne jest rozbicie na
>> kilka transakcji, więc mechanizm i tak jest niezbędny.
>
> Tutaj tematem nie jest jak zrobić aktualizację tylko czy ktoś stosuje samo add not null default.... i mu to działa czy może to jednak babol FB
W MSSQL działa ;-)

>> Być może dodawałeś pole do pustej tabeli to problemu nie było.
> Nie....nawet kilkadziesiąt tyś. rekordów.
>


-- 
wloochacz
Re: Firebird - dodawanie pola not null z wartością domyślną
#82418
Author: bunias80
Date: Wed, 26 Nov 2014 15:44
24 lines
2647 bytes
W dniu środa, 26 listopada 2014 16:36:40 UTC+1 użytkownik wloochacz napisał:

> I tak powinno to zadziałać; a więc, jeśli robisz ADD FIELD NOT NULL with 
> DEFAULT, to przy dodaniu tego nowego pola do tabeli jego wartość powinna 
> zostać automatycznie ustalona tym, co zostało określone jako wartość 
> domyślna. Ale to zadziała tylko i wyłącznie wtedy, kiedy od razu nadasz 
> ograniczenie NOT NULL.
> 
> A jeśli zrobiłeś tak:
> 1) Dodaj nowe pole z wartością domyślną
> 2) Druga operacja - nadanie ograniczenia not null
> To efekt będzie taki, jak opisujesz.

robię to jednym poleceniem
ALTER TABLE INWESTYCJA ADD IDWYNIK INTEGER DEFAULT -1 NOT NULL

zastanawia mnie jedno bo sporo pól tak dodałem. Tylko na tym się "wywala" i teraz czy powinienem przygotować update tabelaA set nowePolaA = -1 where nowePoleA is null dla każdego wcześniej dodanego pola żeby mieć czyste sumienie czy może szukać problemu co z tym konkretnym polem jest nie tak że backup się na nim wywalił. 

> 
> 

> W MSSQL działa ;-)
> 
no to kupujemy FD i już wszystko przenosimy na MSSQLa. Przecież to dwa kliknięcia :-)
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads