如果不指定约束名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 姓名(删除用户)