programmera.net -> oracle -> normal     för utskrift      info@programmera.net

Tabeller i Oracle

1. Tabeller
2. CREATE TABLE
3. ALTER TABLE-syntax
4. ALTER TABLE ... RENAME TO
5. ALTER TABLE ... ADD()
6. ALTER TABLE ... MODIFY()
7. ALTER TABLE ... RENAME COLUMN
8. ALTER TABLE ... SET UNUSED
9. ALTER TABLE ... DROP
10. DROP TABLE

1. Tabeller

Tabeller lagrar data och är därför det viktigaste objektet i en databas. En tabell kan ha en eller flera kolumner och varje kolumn kan ha restriktioner knutna till sig (se  Restriktioner ).

2. CREATE TABLE

Du skapar tabeller med CREATE TABLE. Den generella syntaxen ser ut på detta sätt:
CREATE TABLE tabellnamn (
	kolumnnamn DATATYP [restriktioner]
	[,kolumnnamn DATATYP [restriktioner]]
	...
) [restriktioner];
Eller så kan man skapa tabeller från en SUBSELECT:
CREATE TABLE tabellnamn AS
SELECT ... FROM ... [WHERE osv.];
Ett exempel:
SQL> CREATE TABLE emp1(
	emp_pk NUMBER(10) NOT NULL PRIMARY KEY,
	dep_pk NUMBER(10) NOT NULL REFERENCES dep(dep_pk),
	first_name VARCHAR(20),
	last_name VARCHAR(20)
);

Tabellen är skapad.

SQL> DESC emp1;
 Namn                                      Null?    Typ
 ----------------------------------------- -------- ----------------------------
 EMP_PK                                    NOT NULL NUMBER(10)
 DEP_PK                                    NOT NULL NUMBER(10)
 FIRST_NAME                                         VARCHAR2(20)
 LAST_NAME                                          VARCHAR2(20)

Vi lägger till en rad data i tabellen:
SQL> INSERT INTO emp1 (emp_pk, dep_pk, first_name, last_name)
VALUES(1,1,'Sven','Svensson');

1 rad är skapad.

3. ALTER TABLE-syntax

Med ALTER TABLE kan man förändra strukturen på en redan existerande tabell. Såhär ser syntaxen ut för de kommandon som har med kolumner att göra:
ALTER TABLE tabellnamn
	RENAME TO tabellnamn2
	| [NO]PARALLELL [nr]
	| ADD( kolumnnamn DATATYP [restriktioner] )
	| MODIFY (kolumnnamn [DATATYP] [DEFAULT utr] [restriktioner])
	| RENAME COLUMN kolumnnamn TO kolumnnamn2 
	| DROP COLUMN kolumnnamn [{CASCADE CONSTRAINTS | INVALIDATE}]
	| DROP (kolumnnamn1, kolumnnamn2, ..) [{CASCADE CONSTRAINTS | INVALIDATE}] 
	| SET UNUSED COLUMN kolumnnamn [{CASCADE CONSTRAINTS | INVALIDATE}]
	| SET UNUSED (kolumnnamn1, kolumnnamn2, ..) [{CASCADE CONSTRAINTS | INVALIDATE}]
Funktionen RENAME på kolumner är ny för Oracle 9i. ALTER TABLE kan även lägga till och ta bort restriktioner på en tabell (se  Restriktioner ).

4. ALTER TABLE ... RENAME TO

Att byta namn på en tabell görs på följande sätt:
SQL> ALTER TABLE emp1 RENAME TO emp2;

Tabell är ändrad.
	

5. ALTER TABLE ... ADD()

Med ALTER TABLE kan man lägga till nya kolumner i en existerande tabell. Vi testar att addera en kolumn:
SQL> ALTER TABLE emp1 
ADD( idnr CHAR(10) DEFAULT '0000000000');

Tabell är ändrad.

Här ser vi att de redan existerande raderna får den nya kolumnens defaultvärde:
SQL> SELECT * FROM emp1;

    EMP_PK     DEP_PK FIRST_NAME           LAST_NAME            IDNR
---------- ---------- -------------------- -------------------- ----------
         1          1 Sven                 Svensson             0000000000
Det är inte möjligt att addera en NOT NULL-kolumn till en tabell som innehåller data om man inte specifierar ett defaultvärde, se nedan:
SQL> ALTER TABLE emp1 
	ADD (address VARCHAR2(100) NOT NULL);

ALTER TABLE emp1
            *
Fel på rad 1:
ORA-01758: tabell måste vara tom för tillägg av obligatorisk (NOT NULL) kolumn

6. ALTER TABLE ... MODIFY()

Med ALTER TABLE kan man förändra existerande kolumner. I exemplet nedan byter vi datatyp på kolumnen FIRST_NAME:
SQL> ALTER TABLE emp1 
	MODIFY(first_name CHAR(10));

Tabell är ändrad.

SQL> SELECT * FROM emp1;

    EMP_PK     DEP_PK FIRST_NAME LAST_NAME            IDNR
---------- ---------- ---------- -------------------- ----------
         1          1 Sven       Svensson             0000000000

Här såg vi att det till och med är möjligt att krympa datatyperna för existerande kolumner. Men man kan inte krympa en kolumn till mindre än det största värdet:
SQL> ALTER TABLE emp1 MODIFY( last_name CHAR(3));
ALTER TABLE emp1 MODIFY( last_name CHAR(3))
                         *
Fel på rad 1:
ORA-01441: kan inte minska kolumnlängden därför att något värde är för stort

7. ALTER TABLE ... RENAME COLUMN

Möjligheten att byta namn på en kolumn är ny för Oracle 9i. Ett exempel:
SQL> ALTER TABLE emp1 RENAME COLUMN emp_pk TO emp_id;

Tabell är ändrad.

SQL> SELECT * FROM emp1;

    EMP_ID     DEP_PK FIRST_NAME LAST_NAME            IDNR
---------- ---------- ---------- -------------------- ----------
         1          1 Sven       Svensson             0000000000

Här ser vi att den första kolumnen har bytt namn till EMP_ID.

8. ALTER TABLE ... SET UNUSED

Med SET UNUSED förändrar man strukturen på tabellen utan att faktiskt radera den kolumn som tas bort. Detta går mycket snabbare än motsvarande DROP COLUMN på stora tabeller. En kolumn som är UNUSED kan senare tas bort med ALTER TABLE ... DROP UNUSED COLUMNS. Vi kan till exempel göra oss av med kolumnen DEP_PK:
SQL> ALTER TABLE emp1 
	SET UNUSED COLUMN dep_pk;

Tabell är ändrad.

SQL> SELECT * FROM emp1;

    EMP_PK FIRST_NAME LAST_NAME            IDNR
---------- ---------- -------------------- ----------
         1 Sven       Svensson             0000000000

SQL> ALTER TABLE emp1 DROP UNUSED COLUMNS;

Tabell är ändrad.

9. ALTER TABLE ... DROP

Med ALTER TABLE kan man även ta bort kolumner från tabellen. Ett exempel:
SQL> ALTER TABLE emp1 DROP COLUMN idnr;

Tabell är ändrad.

10. DROP TABLE

Med DROP TABLE kan man kasta en tabell som inte längre används. Syntaxen ser ut såhär:
DROP TABLE tabellnamn [CASCADE CONSTRAINTS]
CASCADE CONSTRAINTS innebär att Oracle går in i andra tabeller och tar bort de restriktioner som refererar till den borttagna tabellens primärnyckel. Nedan ges ett exempel:
SQL> DROP TABLE emp1;

Tabell är borttagen.

Eftersom det inte finns några andra tabeller som refererar till EMP1 behövs inte CASCADE CONSTRAINTS.