[TOC]
表
创建
# 必须具备创建表的权限、一定的存储空间
create table 表名(
列名 数据类型 约束,
列名 数据类型 约束,
... ...
);
示例
create table student(
sno number primary key,
sname varchar2(50) not null,
sbirth date,
sgrade number(2) foreign key references dept(deptno) ,
ssex char(5) check(ssex='男' or ssex='女'),
stel char(11),
sid varchar2(18) unique,
smail varchar2(30)
);
# 注意:
在自己创建的用户下操作,分配表空间
列名不要用敏感词
不要都使用char
create table xi(
xiid number(2) primary key,
xiname varchar2(50) unique,
xiboss varchar2(50) not null,
xibelong varchar2(8) check(xibelong='南湖校区' or xibelong='浑南校区')
);
create table class(
cno number(6) primary key,
cname varchar2(20) unique,
xiid number(2) references xi(xiid)
);
insert into xi values(1,'计算机科学系','张三','南湖校区')
insert into xi values(1,'计算机科学系','张三','南湖校区')
用子查询语法创建表
CREATE TABLE table[(column, column...)] AS subquery;
# 示例:
CREATE TABLE dept10
AS
SELECT empno, ename, sal+1000 newSalary
FROM emp WHEREdeptno=10;
显示表结构
desc 表名
修改表
添加列(字段)
ALTER TABLE 表名 ADD (列名 数据类型[DEFAULT 默认值] [,列名 数据类型]...);
修改列(字段)
ALTER TABLE 表名 MODIFY (列名 数据类型[DEFAULT 默认值] [,列名 数据类型]...);
# 添加默认值示例
ALTER TABLE dossier MODIFY(sex DEFAULT ‘男’);
删除列(字段)
ALTER TABLE 表名 DROP (列名 [,列名]);
修改列名(字段名)
ALTER TABLE 表名 RENAME COLUMN 原有列名 TO 新列名
删除表
DROP TABLE 表名;
重命名表
rename old_name TO new_name;
截断表(清空表)
就是清空表
truncate是DDL语言只能删除表中所有记录释放存储空间 ,使用rollback不可以回滚。
delete是DML语言,可以删除指定记录,不释放存储空间,使用 rollback可以回滚。
truncate table 表名;
约束
约束类型
约束 | 说明 |
---|---|
not null | 非空约束,指定某列的所有行数据不能包含空值(常用) |
unique | 唯一性约束,指定列或者列的组合 的所有行数据必须 唯一 |
primary key | 主键约束,表的每行的唯一性标识,指定列或者列的组合的所有行数据必须唯一,不允许为null |
foreign key | 外键约束,在列及引用列上建立的一种强制依赖关系(默认有关系,但一般不建立外键关系) |
check | 检查性约束,在列上指定一个必须满足的条件(不要用) |
default | 默认约束(少用) |
定义外键约束
# 定义在列一级
CREATE TABLE emp_fk1(
empno NUMBER(4),
ename VARCHAR2(10) NOT NULL,
job VARCHAR2(9),
deptno NUMBER(7,2) NOT NULL CONSTRAINT emp_deptno_fk REFERENCES dept (deptno),
sal number(7,2)
);
# 定义在表一级
CREATE TABLE emp_fk2(
empno NUMBER(4),
ename VARCHAR2(10) NOT NULL,
deptno NUMBER(7,2) NOT NULL,
CONSTRAINT emp_deptno_fk FOREIGN KEY (deptno) REFERENCES dept (deptno) ON DELETE CASCADE
);
# emp_deptno_fk:约束名
# FOREIGN KEY: 定义在子表的列中
# REFERENCES: 引用列所在的父表
# ON DELETE CASCADE:当父表中的行被删除时,子表中相依 赖的行同时被删除;
# ON DELETE SET NULL:当父表的行被删除时,子表中相依赖 的行被转换为空值;
注:无ON DELETE CASCADE 或 ON DELETE SET NULL选项,当附表中的行被删除时,如果父表中的行在子表中被引用,则提 示不能被删除。
追加约束
ALTER TABLE 表名 ADD [CONSTRAINT 约束名字] 约束类型 (受约束影响的列的名字);
删除约束
ALTER TABLE 表名 DROP PRIMARY KEY|UNIQUE(受约束影响的列的名字)|CONSTRAINT 约束名 [CASCADE];
# cascade 级联删除
锁定表
LOCK TABLE tables IN lock_mode MODE [ WAIT [, integer] | NOWAIT ];
# 下面是一个如何在 Oracle 中使用 LOCK TABLE 语句的例子
LOCK TABLE suppliers IN SHARE MODE NOWAIT;
# 这个例子会锁定 suppliers 表在共享模式,而不是等待锁定被释放
- tables:用逗号分隔的表格列表
- WAIT:它指定数据库将等待(达到指定整数的特定秒数)以获取 DML 锁定。
- NOWAIT:它指定数据库不应该等待释放锁。
lock_mode
lock_mode | 描述 |
---|---|
ROW SHARE | 允许同时访问表,但阻止用户锁定整个表以进行独占访问。 |
ROW EXCLUSIVE | 允许对表进行并发访问,但阻止用户以独占访问方式锁定整个表并以共享方式锁定表。 |
SHARE UPDATE | 允许同时访问表,但阻止用户锁定整个表以进行独占访问。 |
SHARE | 允许并发查询,但用户无法更新锁定的表。 |
SHARE ROW EXCLUSIVE | 用户可以查看表中的记录,但是无法更新表或锁定SHARE 表中的表。 |
EXCLUSIVE | 允许查询锁定的表格,但不能进行其他活动。 |