1. 程式人生 > >Oracle的表操作,CURD、約束

Oracle的表操作,CURD、約束

薪水 整型 set null create ons 建表語句 ott pri between

回顧MySQL創建表語句users(id整型/name字符串/birthday日期型,默認今天)
drop table if exists users;
create table if not exists users(
id int(5) auto_increment primary key,
name varchar(4) not null,
birthday date default ‘2015-4-27‘
);

使用oracleSQL,創建用戶表users(id整型/name字符串/birthday日期/sal整型,默認今天)
create table users(
id number(5) primary key,
name varchar2(8) not null unique,
sal number(6,2) not null,
birthday date default sysdate
);

進入回收站
drop table users;

查詢回收站中的對象
show recyclebin;

閃回,即將回收站還原
flashback table 表名 to before drop;
flashback table 表名 to before drop rename to 新表名;

徹底刪除users表
drop table users purge;

清空回收站
purge recyclebin;

測試如下類型
(1)number(5):
insert into users(id,name,sal) values(1,‘A‘,6666.66);
insert into users(id,name,sal) values(11,‘AA‘,6666.66);
insert into users(id,name,sal) values(111,‘AAA‘,6666.66);
insert into users(id,name,sal) values(1111,‘AAAA‘,6666.66);
insert into users(id,name,sal) values(99999,‘AAAAA‘,6666.66);
insert into users(id,name,sal) values(100000,‘AAAAAA‘,6666.66); 錯
5表示最多存99999

(2)number(6,2):
col sal for 9999.99
insert into users(id,name,sal) values(1,‘A‘,6.66);
insert into users(id,name,sal) values(11,‘AA‘,66.666);
insert into users(id,name,sal) values(111,‘AAA‘,666.6666);
insert into users(id,name,sal) values(1111,‘AAAA‘,6666.66666);
insert into users(id,name,sal) values(11111,‘AAAAA‘,66666.666666);錯
number(6,2)
其中2表示最多顯示2位小數,采用四舍五入,不足位數補0,同時要設置col ... for ...
其中6表示小數+整數不多於6位
其中整數位數不得多於4位,可以等於4位

(3)varchar2(8):
insert into users(id,name,sal) values(1,‘A‘,7777.77);
insert into users(id,name,sal) values(2,‘AA‘,7777.77);
insert into users(id,name,sal) values(3,‘AAA‘,7777.77);
insert into users(id,name,sal) values(4,‘AAAA‘,7777.77);
insert into users(id,name,sal) values(5,‘AAAAA‘,7777.77);
insert into users(id,name,sal) values(6,‘AAAAAA‘,7777.77);
insert into users(id,name,sal) values(7,‘AAAAAAA‘,7777.77);
insert into users(id,name,sal) values(8,‘AAAAAAAA‘,7777.77);
insert into users(id,name,sal) values(9,‘AAAAAAAAA‘,7777.77);錯

insert into users(id,name,sal) values(1,‘哈‘,7777.77);
insert into users(id,name,sal) values(2,‘哈哈‘,7777.77);
insert into users(id,name,sal) values(3,‘哈哈哈‘,7777.77);
insert into users(id,name,sal) values(4,‘哈哈哈哈‘,7777.77);
insert into users(id,name,sal) values(5,‘哈哈哈哈哈‘,7777.77);錯

8表示字節
GBK 趙 2字節

(4)date:默認格式為:‘27-4月-15‘
(5)CLOB【Character Large OBject】:大文本對象,即超過65565字節的數據對象,最多存儲4G
(6)BLOB【Binary Large OBject】:大二進制對象,即圖片,音頻,視頻,最多存儲4G

為emp表增加image列,alter table 表名 add 列名 類型(寬度)
alter table emp
add image blob;

修改ename列的長度為20個字節,alter table 表名 modify 列名 類型(寬度)
alter table emp
modify ename varchar2(20);

刪除image列,alter table 表名 drop column 列名
alter table emp
drop column image;

重名列名ename為username,alter table 表名 rename column 原列名 to 新列名
alter table emp
rename column ename to username;

將emp表重命名emps,rename 原表名 to 新表名
rename emp to emps;

註意:修改表時,不會影響表中原有的數據

筆試題:有【1000億】條會員記錄,如何用最高效的方式將薪水字段清零,其它字段內容不變?

第一:從emp表中刪除sal字段
alter table emp
drop column sal;

第二:向emp表中添加sal字段,且內容默認0
alter table emp
add sal number(6) default 0;

修改表不可回滾

創建表customers(單)和orders(多),使用primary key/not null/unique/default/foreign key約束
要體現【on delete cascade/on delete set null】
需求:刪除客戶,級聯刪除他所有的訂單
delete from customers where id = 1;
需求:刪除客戶,不級聯刪除他所有的訂單,只是將外健設置為NULL
delete from customers where id = 1;

create table customers(
id number(3) primary key,
name varchar2(4) not null unique
);
insert into customers(id,name) values(1,‘A‘);
insert into customers(id,name) values(2,‘B‘);

create table orders(
id number(3) primary key,
isbn varchar2(6) not null unique,
price number(3) not null,
cid number(3),
constraint cid_FK foreign key(cid) references customers(id) on delete cascade
--constraint cid_FK foreign key(cid) references customers(id) on delete set null
);
insert into orders(id,isbn,price,cid) values(1,‘isbn10‘,10,1);
insert into orders(id,isbn,price,cid) values(2,‘isbn20‘,20,1);
insert into orders(id,isbn,price,cid) values(3,‘isbn30‘,30,2);
insert into orders(id,isbn,price,cid) values(4,‘isbn40‘,40,2);

創建表students,包括id,name,gender,salary字段,使用check約束【性別只能是男或女,薪水介於6000到8000之間】
create table students(
id number(3) primary key,
name varchar2(4) not null unique,
gender varchar2(2) not null check ( gender in (‘男‘,‘女‘) ),
salary number(6) not null check ( salary between 6000 and 8000 )
);
insert into students(id,name,gender,salary) values(1,‘哈哈‘,‘中‘,6000);錯
insert into students(id,name,gender,salary) values(2,‘呵呵‘,‘男‘,5000);錯
insert into students(id,name,gender,salary) values(3,‘嘻嘻‘,‘女‘,7000);對

修改外鍵約束
1、刪除外鍵
SQL> alter table orders drop constraint cid_FK;
2、重新添加外鍵約束
SQL> alter table orders drop constraint cid_FK foreign key(cid) reference customers(id) on delete set null;
測試:
SQL> delete from customers where id = 2;
SQL> select * from orders;

ID ISBN PRICE CID
---------- ------------ ---------- ----------
3 isbn30 30
4 isbn40 40

SQL> update orders set cid = 2;
*第 1 行出現錯誤:
ORA-02291: 違反完整約束條件 (SCOTT.CID_FK) - 未找到父項關鍵字
1、先插入父表數據才可
SQL> insert into customers(id,name) values(2,‘B‘);
2、修改子表
SQL> update orders set cid = 2;
SQL> select * from orders;
ID ISBN PRICE CID
---------- ------------ ---------- ----------
3 isbn30 30 2
4 isbn40 40 2

Oracle的表操作,CURD、約束