一、約束
1、not NULL:非空約束,不允許爲null值
建表時創建:
CREATE TABLE 表名(
列名 數據類型 DEFAULT 默認值 NOT NULL,
...
);
修改表時創建非空約束:
ALTER TABLE 表名 MODIFY(列名 NOT NULL);
由not NULL 修改爲null
ALTER TABLE 表名 MODIFY(列名 NULL);
CREATE TABLE A(
ID NUMBER(4) DEFAULT 1 NOT NULL,
NAME VARCHAR2(20) NOT NULL
);
INSERT INTO A(NAME) VALUES('aaa');
INSERT INTO A(ID) VALUES(5);
2、主鍵:又稱爲唯一索引鍵 不允許主鍵列的值爲Null且不允許重複
PRIMARY KEY.
建表時創建:
CREATE TABLE 表名(
列名 數據類型 DEFAULT 默認值 primary key,
...
);
CREATE TABLE 表名(
列名 數據類型 DEFAULT 默認值,
...
列名 數據類型 DEFAULT 默認值,
constraint 約束名 primary key(約束內容)
);
修改表時創建:
ALTER TABLE 表名 ADD CONSTRAINT 約束名 PRIMARY KEY(約束內容);
刪除主鍵約束:
ALTER TABLE 表名 DROP CONSTRAINT 約束名;
DROP TABLE A;
CREATE TABLE A(
ID NUMBER(4) PRIMARY KEY,
NAME VARCHAR2(20)
);
INSERT INTO A(NAME) VALUES('aaa');
INSERT INTO A(ID,NAME) VALUES(1,'aaa');
DESC A;
ALTER TABLE A MODIFY(ID NULL); ---不能將主鍵約束的not null修改爲null
ALTER TABLE A DROP CONSTRAINT SYS_C009789;
3、唯一約束 : 不允許重複值
建表時創建:
CREATE TABLE 表名(
列名 數據類型 DEFAULT 默認值 unique,
...
);
CREATE TABLE 表名(
列名 數據類型 DEFAULT 默認值,
...
列名 數據類型 DEFAULT 默認值,
constraint 約束名 unique(約束內容)
);
修改表時創建:
ALTER TABLE 表名 ADD CONSTRAINT 約束名 unique(約束內容);
刪除主鍵約束:
ALTER TABLE 表名 DROP CONSTRAINT 約束名;
DROP TABLE A;
CREATE TABLE A(
ID NUMBER(3) PRIMARY KEY,
NAME VARCHAR2(20) UNIQUE
);
INSERT INTO A(ID) VALUES(3);
SELECT * FROM A;
4、檢查約束 :check
建表時創建:
CREATE TABLE 表名(
列名 數據類型 DEFAULT 默認值 check(條件),
...
);
CREATE TABLE 表名(
列名 數據類型 DEFAULT 默認值,
...
列名 數據類型 DEFAULT 默認值,
constraint 約束名 check(條件)
);
修改表時創建:
ALTER TABLE 表名 ADD CONSTRAINT 約束名 check(條件);
刪除檢查鍵約束:
ALTER TABLE 表名 DROP CONSTRAINT 約束名;
DROP TABLE A;
CREATE TABLE A(
ID NUMBER(3) CHECK(ID BETWEEN 1 AND 100)
);
INSERT INTO A VALUES(0);
5、外鍵:子表的外鍵的值必須在父表的主鍵中存在
父表:主鍵
子表:外鍵
FOREIGN KEY
建表時創建:
CREATE TABLE 表名(
列名 數據類型 DEFAULT 默認值 references 父表(主鍵) on delete cascade,
...
);
CREATE TABLE 表名(
列名 數據類型 DEFAULT 默認值,
...
列名 數據類型 DEFAULT 默認值,
constraint 約束名 foreign key(外鍵) references 父表(主鍵) on delete cascade
);
修改表時創建:
ALTER TABLE 表名 ADD CONSTRAINT 約束名 foreign key(外鍵) references 父表(主鍵) on delete cascade;
刪除檢查鍵約束:
ALTER TABLE 表名 DROP CONSTRAINT 約束名;
ON DELETE CASCADE:級聯刪除 當刪除父表的主鍵記錄時子表的相關記錄會一併刪除
DROP TABLE A;
CREATE TABLE A(
ID NUMBER(3) PRIMARY KEY,
NAME VARCHAR2(20) UNIQUE
);
CREATE TABLE b(
bid NUMBER(3) REFERENCES A(ID) ON DELETE CASCADE,
NAME VARCHAR2(20)
);
INSERT INTO A VALUES(1,'aaa');
INSERT INTO b VALUES(1,'aaa');
SELECT * FROM A;
SELECT * FROM b;
DELETE FROM A;
ALTER TABLE b ADD CONSTRAINT scott_b_name_fk FOREIGN KEY(NAME) REFERENCES A(NAME);
drop table b;
CREATE TABLE b(
bid NUMBER(3) REFERENCES A(ID),
NAME VARCHAR2(20)
);
二、視圖:
CREATE [or replace] VIEW 視圖名 AS 子查詢[ WITH READ ONLY | WITH CHECK OPTION];
不佔用空間
減少查詢的難度
1、創建視圖表:
---創建查詢emp20部門員工信息的視圖表
CREATE or replace VIEW v_emp20 AS SELECT * FROM emp WHERE deptno=40;
SELECT * FROM v_emp20;
INSERT INTO v_emp20(empno,ename,mgr,sal,deptno) VALUES(1111,'lisi',7566,3000,20);
INSERT INTO v_emp20(empno,ename,mgr,sal,deptno) VALUES(1112,'zhangsan',7566,3000,10);
update v_emp20 set deptno=40;
delete from v_emp20;
SELECT * FROM emp;
2、with READ ONLY:只讀視圖
CREATE OR REPLACE VIEW v_emp30 AS SELECT * FROM emp WHERE deptno=30 WITH READ ONLY;
SELECT * FROM v_emp30;
DELETE FROM v_emp30;
INSERT INTO v_emp30(empno,ename,mgr,sal,deptno) VALUES(1113,'zhangsan',7566,3000,10);
3、with CHECK OPTION:條件檢查
CREATE OR REPLACE VIEW v_emp30 AS SELECT * FROM emp WHERE deptno=30 WITH CHECK OPTION;
SELECT * FROM v_emp30;
INSERT INTO v_emp30(empno,ename,mgr,sal,deptno) VALUES(1113,'zhangsan',7566,3000,10); ----錯誤
INSERT INTO v_emp30(empno,ename,mgr,sal,deptno) VALUES(1113,'zhangsan',7566,3000,30);
DELETE FROM v_emp30;
4、複雜視圖:
(01)視圖的子查詢中包含distinct,不允許對視圖表增刪改操作,只能查詢
CREATE OR REPLACE VIEW v_emp AS SELECT DISTINCT deptno,JOB FROM emp;
SELECT * FROM v_emp;
DELETE FROM v_emp;
INSERT INTO v_emp VALUES(20,'clerk');
UPDATE v_emp SET deptno=20;
(02)視圖的子查詢中包含rownum,不允許對視圖表增刪改操作,只能查詢
CREATE OR REPLACE VIEW v_emp AS SELECT rownum r,empno,ename,sal FROM emp;
SELECT * FROM v_emp;
DELETE FROM v_emp;
INSERT INTO v_emp VALUES(20,8888,'aaa',2000);
UPDATE v_emp SET sal=20;
(03)視圖的子查詢中包含分組函數,不允許對視圖表增刪改操作,只能查詢
CREATE OR REPLACE VIEW v_emp AS SELECT count(empno) c,sum(sal) s FROM emp;
SELECT * FROM v_emp;
DELETE FROM v_emp;
INSERT INTO v_emp VALUES(18,20000);
update v_emp set c=20;
(04) 視圖的子查詢中包含了group BY 子句,不允許對視圖表進行刪除和修改的操作,允許新增和查詢
CREATE OR REPLACE VIEW v_emp AS SELECT empno,ename FROM emp group by empno,ename;
SELECT * FROM v_emp;
DELETE FROM v_emp;
INSERT INTO v_emp VALUES(8888,'wangwu');
update v_emp set empno=20;
(05)視圖的子查詢中包含了表達式, 不允許對視圖表的表達式列進行增加和修改的操作,允許對非表達式的列進行增刪改查
CREATE OR REPLACE VIEW v_emp AS SELECT empno,sal*12 salary FROM emp;
SELECT * FROM v_emp;
DELETE FROM v_emp;
ROLLBACK;
INSERT INTO v_emp VALUES(8888,30000);
INSERT INTO v_emp(empno) VALUES(9999);
update v_emp set empno=20 where rownum=1;
(06)視圖的子查詢中不包含源表中的非空約束列,不允許對錶進行新增,允許修改,刪除 和查詢
DESC emp;
CREATE OR REPLACE VIEW v_emp AS SELECT ename,sal FROM emp;
INSERT INTO v_emp VALUES('aaa',5000);
UPDATE v_emp SET sal=3000;
DELETE FROM v_emp;
rollback;
5、刪除視圖
DROP VIEW 視圖名;
DROP VIEW v_emp;
三、序列
1、創建序列
CREATE SEQUENCE 序列名
[INCREMENT BY n] ----步長
[START WITH n] ---序列的起始值 序列創建後第一次使用的第一個值
[MINVALUE n] ---序列的最小值 序列從第二次循環取值時的最小值
[MAXVALUE n] ---序列的最大值
[CYCLE] ---序列設置循環取值的標誌
[CACHE n] ---序列緩存的個數
---所有屬性都爲默認值的序列
CREATE SEQUENCE myseq;
---設置屬性爲指定值的序列
CREATE SEQUENCE seq1
INCREMENT BY 5
START WITH 10
MINVALUE 5
MAXVALUE 50
CYCLE
CACHE 5;
兩個屬性:
currval:取序列當前值
nextval:序列的下一個值
語法:序列名.屬性名
注意:當一個序列創建成功之後,必須先用nextval生成第一個序列值纔可以使用該序列
SELECT myseq.nextval FROM dual;
SELECT myseq.currval FROM dual;
SELECT seq1.nextval,seq1.currval FROM dual;
DROP TABLE A CASCADE CONSTRAINTS;
CREATE TABLE A(
ID NUMBER(5) PRIMARY KEY
);
insert into a values(myseq.nextval);
select * from a;
2、修改序列
alter SEQUENCE 序列名
[INCREMENT BY n] ----步長
[MINVALUE n] ---序列的最小值 序列從第二次循環取值時的最小值
[MAXVALUE n] ---序列的最大值
[CYCLE] ---序列設置循環取值的標誌
[CACHE n] ---序列緩存的個數
3、刪除序列
DROP SEQUENCE 序列名;
四、索引
1、創建索引
手動創建:
CREATE INDEX 索引名 ON 表名(列名[,列名...]);
CREATE TABLE employee1(
pno NUMBER(7),
pname VARCHAR2(20)
);
CREATE INDEX inx_scott_pno ON employee1(pno);
INSERT INTO employee1 SELECT empno,ename FROM emp;
COMMIT;
select * from employee1;
INSERT INTO employee1 SELECT * FROM employee1;
UPDATE employee1 SET pno=ROWNUM;
SELECT *
FROM employee1
where pno=99999;
SELECT *
FROM employee1
where UPPER(ENAME)='SCOTT';
函數索引:
CREATE INDEX inx_scott_pname ON employee1(upper(pname));
CREATE INDEX inx_scott_pno_pname ON employee1(pno,pname);
自動創建索引:當創建主鍵或唯一鍵時,也會自動創建對應列的索引
2\刪除索引:
DROP INDEX 索引名;
DROP INDEX inx_scott_pname;
select * from user_indexes;
1.使用子查詢的方式,創建test表。
create table test99 as select empno,ename,sal,deptno from emp;
2.快速複製test表中的數據,複製到100w條左右
INSERT INTO TEST SELECT * FROM TEST;
DESC test99;
alter table test99 modify(empno number(12));