• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Oracle SQL tworzenie tabeli z ograniczeniami

Object Storage Arubacloud
0 głosów
173 wizyt
pytanie zadane 14 stycznia 2023 w SQL, bazy danych przez haitoke Nowicjusz (240 p.)

Cześć, mam następujące zadanie do wykonania:
Dokonaj modyfikacji tabeli Kolejki poprzez dodanie kolumny wirtualnej o nazwie dzien_tygodnia zawierającej słowną nazwę dnia tygodnia odbywania się danej kolejki (na podstawie kolumny data_kolejki) ze zdefiniowanym ograniczeniem umożliwiającym przyjmowanie kolumnie tylko jeden z dwóch fraz: środa lub sobota.

Próbowałem rozwiązać je następującym poleceniem: 

alter table Kolejki add dzien_tygodnia varchar2(100) as (to_char(data_kolejki, 'day')) add constraint dzien_tygodnia_ch check (dzien_tygodnia in ('środa', 'sobota'));

No i niby działa ale przy wstawianiu wartości do tabeli Kolejki poleceniem którego nie mogę modyfikować:

insert into kolejki (id_kolejki, sezon, nr_kolejki, data_kolejki) values (1, '2019/2020', 1, to_date('14.09.2019', 'dd.mm.yyyy') );  

 Otrzymuję błąd o treści:

ORA-02290: naruszono więzy CHECK (SYSTEM.DZIEN_TYGODNIA_CH)

Czy jest ktoś w stanie pomóc, ewentualnie naprowadzić na prawidłowe zmodyfikowanie tabeli, tak aby polecenie wstawiające dane działało poprawnie? Wydaje mi się, że błąd jest gdzieś w sposobie pobierania dnia z daty, ale nie potrafię tego "ogarnąć".

2 odpowiedzi

0 głosów
odpowiedź 14 stycznia 2023 przez Wiciorny Ekspert (269,710 p.)

Dlatego że dodajesz element który narusza już więzy na rekord, czyli w sytuacji kiedy w twojej bazie jest już jakiś element o ID = 1 nie możesz dodać takiego samego. 
 

	
insert into kolejki (id_kolejki, sezon, nr_kolejki, data_kolejki) values (1, '2019/2020', 1, to_date('14.09.2019', 'dd.mm.yyyy') ); 

dodajesz tutal element o id_kolejki =>1 , czy taki element istnieje już w bazie jeśli tak, nie możesz takiego dodać..
Analogicznie to działa na każdej unikatowej kolumnie której każda wartość musi być unikatowa. 

Jeśli istniejący REKORD tabeli chces zmodyfikować o nową kolumne, użyj polecenia UPDATE. 

komentarz 14 stycznia 2023 przez haitoke Nowicjusz (240 p.)

Tabela Kolejki dopiero co została utworzona, jest totalnie pusta.

komentarz 14 stycznia 2023 przez Wiciorny Ekspert (269,710 p.)

https://www.oraexcel.com/database-oracle-11gR1-ORA-02290/lang-pl
 

  1. Więzy CHECK – warunek, który ma być prawdziwy dla wszystkich wierszy  w tabeli. Nie może zawierać podzapytania ani funkcji zmiennych w czasie, jak Sysdate lub User. Może zawierać nazwy jednej lub więcej kolumn.

masz odpowiedź, nie możesz zastosować funkcji w tym wypadku i zmiennych które ulegają zmianie czasowej. 
Sprawdź definicje tej kolumny  

A winą tego jest ten fragment 
 

 add constraint dzien_tygodnia_ch check (dzien_tygodnia in ('środa', 'sobota'));

Dokładnie

check (dzien_tygodnia in ('środa', 'sobota'));

Bo to jest niepoprawne 

 

0 głosów
odpowiedź 15 stycznia 2023 przez PreZmyK Pasjonat (21,470 p.)

Zwyczajnie przytnij spacje, bo on będzie zwracał inną wartość(CHAR jest stały), sprawdź sobie:

SELECT length(to_char(to_date('11.09.2019', 'dd.mm.yyyy'), 'day')) FROM DUAL;

i zmień język na taki jaki masz w bazie danych.

alter table Kolejki add (dzien_tygodnia VARCHAR2(30 CHAR)as (TRIM(to_char(data_kolejki, 'day'))))
add constraint dzien_tygodnia_ch check (dzien_tygodnia in ('wednesday', 'saturday'));

To Ci powinno zadziałać. Jeżeli nie chcesz grzebać możesz użyć wyrażenia CASE

ALTER TABLE Kolejki 
ADD (dzien_tygodnia AS (
CASE WHEN TRIM((to_char(data_kolejki, 'day'))) = 'wednesday' THEN 'środa'
WHEN TRIM((to_char(data_kolejki, 'day')))= 'saturday' THEN 'sobota'
ELSE NULL
END))
ADD CONSTRAINT dzien_tygodnia_ch 
CHECK (dzien_tygodnia IN ('środa', 'sobota')) 
ADD CONSTRAINT dzien_tygodnia_nn 
CHECK (dzien_tygodnia IS NOT NULL)
;

 

Podobne pytania

0 głosów
0 odpowiedzi 154 wizyt
0 głosów
2 odpowiedzi 404 wizyt
0 głosów
1 odpowiedź 1,487 wizyt
pytanie zadane 13 sierpnia 2019 w SQL, bazy danych przez AdrianK Początkujący (320 p.)

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...