約束命名規則
如果不指定約束名Oracle server 自動按照SYS_Cn 的格式指定約束名,也可手動指定,
推薦的約束命名是:約束類型_表名_列名。
NN:NOT NULL 非空約束,比如nn_emp_sal
UK:UNIQUE KEY 唯一約束
PK:PRIMARY KEY 主鍵約束
FK:FOREIGN KEY 外鍵約束
CK:CHECK 條件約束
建表時約束定義的基本格式:
字段定義constraint 約束名約否類型(字段名)-->unique,primary key,check
字段定義constraint 約否名foreingn key (字段名)references 表名(字段名)--->foreign
1.定義各種不同的約束
--創建一個用於作外鍵的表tb_dept
SQL> CREATE TABLE tb_dept
2 (
3 deptno NUMBER(4) PRIMARY KEY,
4 deptname VARCHAR2(20),
5 loc VARCHAR(50)
6 );
--建表時創建約束,沒有指定約束名,則系統將自動命名約束名
SQL> CREATE TABLE tb_constraint_1
2 (
3 empno NUMBER PRIMARY KEY, --主鍵約束
4 ename VARCHAR2(20) NOT NULL, --非空約束
5 email VARCHAR2(60) UNIQUE, --唯一約束
6 sal NUMBER(5) CHECK(sal>1500), --核查約束
7 deptno NUMBER(4) REFERENCES tb_dept(deptno) --外鍵約束
8 );
--建表時指定了約束名
SQL> CREATE TABLE tb_constraint_2
2 (
3 empno NUMBER CONSTRAINT pk_tb_cons2_empno PRIMARY KEY,
4 ename VARCHAR2(20) CONSTRAINT nn_tb_cons2_empno NOT NULL,
5 email VARCHAR2(60) CONSTRAINT un_tb_cons2_email UNIQUE,
6 sal NUMBER(5) CONSTRAINT ck_tb_cons2_sal CHECK(sal>1500),
7 deptno NUMBER(4) CONSTRAINT fk_tb_cons2_dept REFERENCES tb_dept(deptno) //外鍵的類型要和指定表的主鍵類型一致 且指定表的那個字段也要為主鍵
8 );
定義符合主鍵約束
--定義復合主鍵
SQL> CREATE TABLE tb_constraint_3
2 (
3 empno NUMBER,
4 ename VARCHAR2(20),
5 email VARCHAR2(20) UNIQUE,
6 CONSTRAINT pk_tb_cons3_empno_ename PRIMARY KEY(empno,ename)
7 );
.級聯約束
CASCADE CONSTRAINTS子句在DROP COLUMN子句中使用
該子句會刪除涉及到在已刪除列上定義的主鍵或唯一關鍵字的所有引用完整性約束
該子句也將刪除在已刪除列上定義的所有多列約束
SQL> CREATE TABLE tb_cons3
2 (
3 empno NUMBER PRIMARY KEY,
4 sal NUMBER ,
5 comm NUMBER,
6 mgr NUMBER,
7 CONSTRAINT fk_tb_cons3 FOREIGN KEY(mgr) REFERENCES tb_cons3(empno),
8 CONSTRAINT ck_tb_cons3_sal CHECK(empno > 0 AND sal > 0),
9 CONSTRAINT ck_tb_cons3_comm CHECK(comm > 0)
10 );
------------------------------------------------------------------------sp分割線----------------------------------------------------------------------------
--主鍵約束
primary key
--非空約束
not null
--檢查約束
check()
--唯一約束
unique
--外鍵約束
foreign key(字段) references 外表命(字段)
--
constraint t_sp_pk primary key(t_id)
constraint t_sp_ck check(t_sex in ('男','女'))
constraint t_sp_uk unique(t_name)
create table t_sp
(
t_id varchar(50),
t_name varchar(50),
t_sex varchar(2),
t_age number(3),
t_bridate date,
s_id varchar(40),
constraint t_id_pk primary key(t_id,t_name),--2個同時做主鍵
constraint t_sex_ck check (t_sex in ('男','女')),
constraint t_age_ck check (t_age between 1 and 120),
constraint t_name_uk unique(t_name),
constraint t_sp_s_id_fk foreign key(s_id) references ss(s_id)
)
create table t_sp
(
t_id varchar(50) primary key ,
t_name varchar(50) unique ,
t_sex varchar(2) check(t_sex in('男','女')),
t_age number(3) check(t_age between 0 and 120),
t_bridate date,
s_id varchar(40) references ss(s_id)
)
--
ss是另外一張表
外鍵使用 注意:
1:在子表中設置的外鍵字段在父表中必須是主鍵:
2:刪除時 應先刪除子表 再刪除父表
不管約束強制性刪除手段
drop table t_sp cascade constraint 不推薦使用
(今天建表的字段之間有空格 提示無效的字符)原來在oracle不支持空格啊!
修改 添加表 刪除表字段 格式:
alter table 表名 add 新列列名 列數據類型 [default 0 not null] (添加列默認值為0)
alter table 表名 drop 列名 (刪除列)
alter table 表名 alter column 列名 新添加的數據類型 (修改列)
imp zhl/password@orcl file=d:\zhl.dmp full=y(直接cmd)
CREATE USER 姓名 IDENTIFIED BY 密碼
grant all on 數據庫名 to 用戶名
drop USER 姓名(刪除用戶)