Szukam i szukam na google ale nie mogę znaleźć różnicy pomiędzy
zwykłym ograniczeniem (w oracle) typu not null lub unique,a
ograniczeniem typu constraint.Z tego co wyczytałem constraint można
nadać nazwę i ewentualnie potem wyłączać, ale czy to jest jedyna
różnica??
Z góry dzięki za pomoc
> Witam
> To mój pierwszy wiec jeżeli pytanie będzie banalne to przepraszam.
>
> Szukam i szukam na google ale nie mogę znaleźć różnicy pomiędzy
> zwykłym ograniczeniem (w oracle) typu not null lub unique,a
> ograniczeniem typu constraint.
Za pomocą not null/uniq nie dasz rady zabronic wpisania jakiegoś ciagu
znaków naprzyklad
check (name not like '%/%')
żaden idota nie wpisze ci slasha w nazwie
ewentualnie
check price => 0
nie bedzie mozliwe wpisanie ceny na minusie :)
> Z tego co wyczytałem constraint można
> nadać nazwę i ewentualnie potem wyłączać, ale czy to jest jedyna
> różnica??
pk,fk,uniq tez mozna wyłączyć nadać wlasna nazwe też można.
No i dobrze, że nie znalazłeś różnicy, bo jej nie ma. Te "zwykłe
ograniczenia" to SĄ więzy integralności (integrity constraints). Żeby
była ścisłość: chodzi ci zapewne o tzw. inline constraints, czyli takie
więzy, które podajesz w definicji tabelki, np PRIMARY KEY, UNIQUE, NOT
NULL tak jak tu:
SQL> CREATE TABLE TEST1
2 (
3 ID INTEGER PRIMARY KEY,
4 FIELD1 VARCHAR2(30) UNIQUE,
5 FIELD2 VARCHAR2(30) NOT NULL
6 );
Table created.
W wyniku tego polecenia powstały trzy więzy, a nazwy zostały im nadane
przez system (zaczynają się od SYS_C), co zaraz zresztą pokażę.
"Z tego co wyczytałem constraint można nadać nazwę"
- otóż takim więzom również można nadać nazwę
SQL> CREATE TABLE TEST2
2 (
3 ID INTEGER CONSTRAINT TEST2_PK PRIMARY KEY,
4 FIELD1 VARCHAR2(30) CONSTRAINT TEST2_F1_UK UNIQUE,
5 FIELD2 VARCHAR2(30) CONSTRAINT TEST2_F2_NN NOT NULL
6 );
Table created.
No to jeszcze dla porównania stwórzmy sobie trzecią tabelkę i tzw. out
of line constraints:
SQL> CREATE TABLE TEST3
2 (
3 ID INTEGER,
4 FIELD1 VARCHAR2(30),
5 FIELD2 VARCHAR2(30)
6 );
Table created.
SQL> ALTER TABLE TEST3 ADD CONSTRAINT TEST3_PK PRIMARY KEY(ID);
Table altered.
SQL> ALTER TABLE TEST3 ADD CONSTRAINT TEST3_F1_UK UNIQUE(FIELD1);
Table altered.
SQL> ALTER TABLE TEST3 ADD CONSTRAINT TEST3_F2_NN CHECK (FIELD2 IS NOT
NULL);
Table altered.
W widoku user_constraints i user_cons_columns można zobaczyć właściwości
wszystkich więzów jakie stworzyłeś:
SQL> SELECT C.TABLE_NAME TABNAME
2 , C.CONSTRAINT_NAME NAME
3 , C.CONSTRAINT_TYPE T
4 , CC.COLUMN_NAME COLNAME
5 , C.SEARCH_CONDITION COND
6 , C.GENERATED
7 FROM USER_CONSTRAINTS C
8 , USER_CONS_COLUMNS CC
9 WHERE C.CONSTRAINT_NAME = CC.CONSTRAINT_NAME
10 ORDER BY C.TABLE_NAME, C.CONSTRAINT_NAME, CC.POSITION;
TABNA NAME T COLNAM COND GENERATED
----- --------------- - ------ -------------------- --------------
TEST1 SYS_C004090 C FIELD2 "FIELD2" IS NOT NULL GENERATED NAME
TEST1 SYS_C004091 P ID GENERATED NAME
TEST1 SYS_C004092 U FIELD1 GENERATED NAME
TEST2 TEST2_F1_UK U FIELD1 USER NAME
TEST2 TEST2_F2_NN C FIELD2 "FIELD2" IS NOT NULL USER NAME
TEST2 TEST2_PK P ID USER NAME
TEST3 TEST3_F1_UK U FIELD1 USER NAME
TEST3 TEST3_F2_NN C FIELD2 FIELD2 IS NOT NULL USER NAME
TEST3 TEST3_PK P ID USER NAME
Jak widać dla każdej tabelki powstały trzy więzy (primary key, unique i
check), tyle że dla TEST1 nazwa została wygenerowana przez system (no i
warunek dla check w TEST1 i TEST2)
"i ewentualnie potem wyłączać..."
- i otóż inline constraints też da się wyłączać
SQL> ALTER TABLE TEST1 DISABLE CONSTRAINT SYS_C004090;
Table altered.
SQL> ALTER TABLE TEST1 DISABLE CONSTRAINT SYS_C004091;
Table altered.
SQL> ALTER TABLE TEST1 DISABLE CONSTRAINT SYS_C004092;
Table altered.
SQL> ALTER TABLE TEST2 DISABLE CONSTRAINT TEST2_F1_UK;
Table altered.
...
Czy to wyjaśnia całą kwestię?
Pozdrawiam,
Marcin