表的创建、修改及约束

1、创建表

CREATE TABLE EMP2 AS SELECT * FROM EMP WHERE 1=2;--只复制表结构

CREATE TABLE TEST1 AS SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE DEPTNO=10;--只复制另一个表中的某几个字段

CREATE TABLE EMP2 AS SELECT * FROM EMP; --复制整张表,包括数据

CREATE TABLE EMP2 AS SELECT * FROM EMP WHERE rownum<=10;--只复制前10行数据

2、插入数据

INSERT INTO DEPT VALUES(50,'DBA','HK');--所有字段都插入值

INSERT INTO DEPT(DEPTNO,DNAME) VALUES(60,'TEST');--只插入其中几个字段值

INSERT INTO EMP2 (SELECT * FROM EMP);--使用子查询插入数据时,不要加values或as

INSERT INTO EMP2 (SELECT * FROM EMP WHERE ROWNUM<=10);

3、更新表中的数据

update emp2 set empno=2222,ename='rusky' where empno=1111;--如果不加where条件,则更新表中的所有行。

update emp2 set (empno,ename)=(2222,'rusky') where empno=1111;--ORA-01767: UPDATE ...SET 表达式必须是子查询 

update emp2 set (ename,job,hiredate)=(select ename,job,hiredate from emp where empno=7369) where empno=1111;--使用子查询修改表

DELETE FROM TEST1 WHERE EMPNO=7782;--删除表中的某一行记录

DELETE FROM TEST;--不加WHERE条件,清空表中所有记录

DELETE FROM EMP2 WHERE DEPTNO=(SELECT DEPTNO FROM DEPT WHERE DNAME='SALES'); --使用子查询删除记录

4、修改表结构

ALTER TABLE DEPT2 ADD (MANAGER NUMBER(4)); --增加列

ALTER TABLE DEPT2 MODIFY(MANAGER NUMBER(4));--修改列属性

ALTER TABLE DEPT2 DROP COLUMN MANAGER;--删除表中的字段

DROP TABLE DEPT2;--直接删除表,包括表数据和表结构。

TRUNCATE TABLE DEPT2;--只清空表中的数据

RENAME DEPT2 TO DEPT3;--修改表名

COMMENT ON TABLE DEPT3 IS 'THIS IS A TEST TABLE'; --给表增加注释

COMMENT ON COLUMN DEPT3.MANAGER IS 'THE MANAGER OF THIS DEPARTMENT';--给某个字段增加注释

5、相关查询及其它

SELECT * FROM USER_TABLES; --查看用户所有表

SELECT DISTINCT OBJECT_TYPE FROM USER_OBJECTS; --查看用户拥有的数据类型

SELECT * FROM USER_CATALOG; --查看用户拥有的表、视图、同义词、序列

查看表、字段、视图、同义词等的注释:

ALL_COL_COMMENTS

USER_COL_COMMENTS

ALL_TAB_COMMENTS

USER_TAB_COMMENTS

====
几种不常见的数据类型
LONG:可保存最大长度为2GB的字符数据
CLOB:可保存最大长度为4GB的字符数据
BLOG:可保存最大长度为4GB的二进制数据
BFILE:在外部文件中存储的二进制数据,最大为4GB
RAW and LONG RAW:存储二进行数据

6、约束
--约束用于确保数据库数据满足特定的商业规则。在Oracle中,约束包括:not null、unique、primary key, foreign key和check五种。

CREATE TABLE Goods(

GoodsId char(8) primary key, --主键

GoodName varchar2(50),

UnitPrice number(10,2) check(UnitPrice>0),--单价必须大于0

Category varchar2(30),

Provider varchar2(100));

--添加注释

COMMENT ON TABLE Goods is ' 商品表Goods(商品号GoodsId,商品名GoodName,单价UnitPrice,商品类别Categroy,供应商Provider)'



CREATE TABLE Customers(

CustomerId char(8) primary key, --主键

Name varchar2(30) not null,--姓名允许为空

Address varchar2(150),

Email varchar2(100) unique, --Email唯一

Gender char(2) default('') check(Gender in('','')), --性别只能是男或女

CardId char(18));

--添加注释

COMMENT ON TABLE Customers is '客户表Customers(客户号CustomerId,姓名Name,住址Address,电邮Email,性别Gender,身份证CardId)'



CREATE TABLE Purchases(

CustomerId char(8) references Customers(Customerid), --外键

GoodId char(8) references Goods(GoodsId),

Num number(10) check(Num between 1 and 30));

--添加注释

COMMENT ON TABLE Purchases is '销售表Purchases(客户号CustomerId,商品号GoodsId,购买数量Num)'

A、表级定义
表级定义是指在定义了所有列后,再定义约束,这里需要注意,not null约束只能在列级上定义。
案例:

sql> create table Goods(

GoodsId char(8),GoodsName varchar2(50), Category varchar(30),

constraint PK_GoodsId primary key(GoodsId));

B、列级定义
列级定义是在定义列的同时定义约束。
案例:

sql>create table Goods(

GoodsId char(8) constraint PK_GoodsId primary key ,--主键

GoodName varchar2(50),

UnitPrice number(10,2) check(UnitPrice>0),--单价必须大于0

Category varchar(30),

Provider varchar(100));

--添加、修改约束
--如果在建表时忘记建立必要的约束,则可以在建表后使用alter table命令为表增加约束,但是要注意:增加not null约束时,需要使用modify选项,而增加其他四种约束使用add选项。

ALTER TABLE Goods modify GoodsId not null;

ALTER TABLE Customers add constraint UQ_CardId unique(Cardid);

--删除约束

sql>alter table 表名 drop constraint 约束名称;

ALTER TABLE Customers drop constraints UQ_CardId;

--修改约束名

ALTER TABLE EMPLOYEE RENAME CONSTRAINT PK_EMPLOYEE TO PK_EMPLOYEE1;

特别说明:
在删除主键约束的时候,可能有错误。比如
alter table 表名 drop primary key;
这是因为如果在两表存在主从关系,那么在删除主表主键约束时,必须带上cascade选项。
sql> alter table 表名 drop primary key cascade;
--查看约束:
SELECT * FROM USER_CONSTRAINTS;
SELECT * FROM USER_CONS_COLUMNS;
================
其它示例:

列级定义约束:

CREATE TABLE DEPARTMENT(

DEPTID NUMBER(2) PRIMARY KEY,--或者DEPTID NUMBER(2) CONSTRAINT PK_DEPARTMENT PRIMARY KEY,

NAME VARCHAR2(12),

LOC VARCHAR2(12)

);

表级定义约束:

CREATE TABLE EMPLOYEE(

EMPID NUMBER(4),

NAME VARCHAR2(10),

DEPTID NUMBER(2),

CONSTRAINT PK_EMPLOYEE PRIMARY KEY(EMPID),

CONSTRAINT FK_DEPARTMENT FOREIGN KEY(DEPTID) REFERENCES DEPARTMENT(DEPTID)

);

====
定义多列的复合约束

CREATE TABLE DEPARTMENT2(

DEPTID NUMBER(2),--或者DEPTID NUMBER(2) CONSTRAINT PK_DEPARTMENT PRIMARY KEY,

DNAME VARCHAR2(12),

LOC VARCHAR2(12),

PRIMARY KEY(DEPTID,DNAME)

);



CREATE TABLE EMPLOYEE2(

EMPID NUMBER(4) PRIMARY KEY,

NAME VARCHAR2(10),

DEPTID NUMBER(2),

DNAME VARCHAR2(12),

CONSTRAINT FK_DEPARTMENT1 FOREIGN KEY(DEPTID,DNAME) REFERENCES DEPARTMENT2(DEPTID,DNAME) ON DELETE CASCADE--当删除部门表中的某个部门信息时,级联删除员工表中的 

DEPTNO,DNAME.或者这样:ON DELETE SET NULL,设为null

);

 

你可能感兴趣的:(创建)