表是Oracle数据库中最基本的对象。对数据库的操作最终都是基于表进行的。
一、建立表
1.直接建立表
语法格式:
CREATE TABLE table_name(
column_name datatype [CONSTRAINT constraint_name DEFAULT default_expression...])
[TABLESPACE tablespace_name]; --默认时,建立的表存储在建表用户的默认表空间中。
数据库完整性约束条件:
RPIMARY KEY P --唯一标识表中的行。
NOT NULL C --规定某一列不允许取空值。
CHECK C --规定一列或一组列的值必须满足指定的约束条件。
UNIQUE U --指定一列或一组列不能取重复值。
FOREIGN KEY R --指定表的外键。外键引用另外一个表中的列,构成参照约束。
CREATE TABLE departments1(
departmend_id NUMBER(3),
CONSTRAINT d1-pk PRIMARY KEY,
department_name VARCHAR2(8) NOT NULL,
director_id NUMBER(5)
);
CREATE TABLE teachers1(
teacher_id NUMBER(5)
CONSTRAINT t1_pk PRIMARY KEY,
name VARCHAR2(6) NOT NULL,
job_title VARCHAR2(10),
hire_date DATE,
bonus NUMBER(4) DEFAULT 800,
wage NUMBER(5),
department_id NUMBER(3)
CONSTRAINT t1_fk_d1
REFERENCES departments1(department_id)
);
CREATE TABLE students1(
student_id NUMBER(5)
CONSTRAINT s1_pk PRIMARY KEY,
name VARCHAR2(10) NOT NULL,
sex VARCHAR2(6)
CONSTRAINT sex_chk1 CHECK(sex IN ('男','女')),
register_date DATE DEFAULT SYSDATE,
phone_number VARCHAR2(12) CONSTRAINT pnum_uq UNIQUE
);
2
2.间接建立表
语法格式:
CREATE TABLE table_name AS subquery;
通过调整subquery可以使新建的表的结构取自原表结构的全部或部分。
CREATE TABLE teacher2 AS SELECT * FROM teachers;
CREATE TABLE students2 AS
SELECT student_id, name FROM students
WHERE specialty = '计算机';
CREATE TABLE teachers3 AS(
SELECT * FROM teachers WHERE department_id = 101
UNION
SELECT * FROM teachers WHERE department_id = 102
);
CREATE TABLE teachers4 AS(
SELECT t.teacher_id, t.name, department_name
FROM teachers t, departments d
WHERE t.department_id = d.department_id
);
二、获取表的相关信息
获得表的相关信息可以使用命令DESCRIBE,也可以通过查询数据字典中的视图user_tables和user_tab_columns。
1.获得表的基本信息
SELECT table_name, tablespace_name, temporary FROM user_tables
WHERE table_name IN(
'STUDENTS1', 'STUDENTS2','TEACHERS3','TEACHERS4'
);
2.获得表中列的信息
DESCRIBE teachers 2;
SELECT column_name, data_type, data_length, data_precision, data_scale
FROM user_tab_columns
WHERE table_name = 'TEACHER2';
三.修改表定义
修改表定义包括增、删、改表的列以及增、删表的约束,控制约束等。所有
这些修改表的操作均通过ALTER TABLE语句实现。
1.增/删/改表的列
(1)添加表的列
--语法格式:
ALTER TABLE table_name ADD column_name datatype...;
--单列
ALTER TABLE students2
ADD enrollment_grade NUMBER(3);
ALTER TABLE students2
ADD register_date DATE DEFAULT SYSDATE;
--多列
ALTER TABLE students2
ADD(enrollment_grade NUMBER(3);
register_date DATE DEFAULT SYSDATE;
);
(2)删除表的列
语法格式:
--单列
ALTER TABLE table_name DROP COLUMN column_name...;
ALTER TABLE students2
DROP COLUMN sex;
--多列
ALTER TABLE students2
drop(sex, enrollment_grade);
(3)修改表的列
--语法格式:
ALTER TABLE table_name MODIFY column_name datatype...;
--单列
ALTER TABLE teacher1
MODIFY wage NUMBER(7,2);
ALTER TABLE teacher1
MODIFY name VARCHAR2(10);
ALTER TABLE teachers1
MODIFY bonus DEFAULT 1000;
--多列
alter table teacher1
modify(wage number(7,2);
name varchar2(10);
bonus default 1000;
);
2.添加/删除约束
(1)添加约束
语法格式:
alter table table_name add constraint constraint_name constraint_expression;
alter table student1
add constraint s1_pk primary key(student_id);
alter table teachers1
add constraint t1_fk_d1
foreign key(department_is) references departments1(departmnet_id);
alter table students1
modify name not null;
alter table students1
add constraint sex_chk1 check(sex in('??','??'));
alter table students1
add constraint pnum_uq unique(phone_number);
(2)删除约束
--语法格式:
ALTER TABLE table_name DROP CONSTRAINT constraint_name;
ALTER TABLE students1
DROP CONSTRAINT s1_pk;
ALTER TABLE teacher1
DROP CONSTRAINT t1_fk_d1;
ALTER TABLE students1
MODIFY name NULL;
ALTER TABLE students1
DROP CONSTRAINT sex_chk1;
ALTER TABLE students1
DROP CONSTRAINT pnum_uq;
3.允许/禁止约束
约束在建立时默认牌允许状态。可以通过使用关键字ENABLE或DISABLE指定或改变约束的允许或禁止状态。
(1)禁止约束
ALTER TABLE students1
ADD CONSTRAINT pnum_uq UNIQUE(phone_number) DISABLE; --在设置时禁止约束。
ALTER TABLE students1
DISABLE CONSTRAINT sex_chk1;
(2)允许约束
ALTER TABLE students1
ENABLE CONSTRAINT pnum_uq;
4.获得有关约束的信息
SELECT owner, constraint_name, constraint_type, status
FROM user_constraints
WHERE table_name = 'TEACHERS1';
四、修改表名
--语法格式:
RENAME table_oldname TO table_newname;
RENAME departments1 TO dep1;
五、删除表
TRUNCATE TABLE teachers1; --只删除表中的所有数据,不删除表的结构。
DROP TABLE teachers2; --删除表的所有数据和表的结构。