Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

ograniczenia constraint

127 views
Skip to first unread message

zyksss

unread,
May 26, 2008, 7:16:12 AM5/26/08
to
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.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

Lukasz D.

unread,
May 26, 2008, 9:23:15 AM5/26/08
to
zyksss wrote:

> 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.

Marcin Wróblewski

unread,
May 26, 2008, 11:23:02 AM5/26/08
to
zyksss pisze:

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

zyksss

unread,
May 27, 2008, 6:27:01 AM5/27/08
to
Tak.Dzięki wielkie za taki odzew.
0 new messages