• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
242 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 (278,610 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 (278,610 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 188 wizyt
0 głosów
2 odpowiedzi 572 wizyt
0 głosów
1 odpowiedź 1,607 wizyt
pytanie zadane 13 sierpnia 2019 w SQL, bazy danych przez AdrianK Początkujący (320 p.)

93,173 zapytań

142,184 odpowiedzi

321,967 komentarzy

62,500 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1149p. - dia-Chann
  2. 1131p. - Łukasz Piwowar
  3. 1124p. - CC PL
  4. 1118p. - Łukasz Eckert
  5. 1097p. - Michal Drewniak
  6. 1081p. - Marcin Putra
  7. 1076p. - rucin93
  8. 1071p. - rafalszastok
  9. 1054p. - Adrian Wieprzkowicz
  10. 1047p. - Piotr Aleksandrowicz
  11. 1036p. - Michał Telesz
  12. 1000p. - ssynowiec
  13. 992p. - Dominik Łempicki (kapitan)
  14. 922p. - Mariusz Fornal
  15. 865p. - Anonim 3619784
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...