序列-索引-约束

Posted lchh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列-索引-约束相关的知识,希望对你有一定的参考价值。

序列-索引-约束

1.序列

序列:也是数据库对象之一,作用是生成一系列的数字,序列常与某张表的主键字段提供值使用。

序列的创建:

--序列的创建
  CREATE SEQUENCE SEQ_NUM_2
  START WITH 1
  INCREMENT  BY 2

START WITH:开始的值。 

INCREMENT BY :步长。

序列中的函数:

      A:NEXTVAL(获取序列的下一个值   第一个值获取的是START WITH 后面的值是START WITH+INCREMENT 每次加步长一次 )

      例:

SELECT SEQ_NUM_1.NEXTVAL
  FROM DUAL;

 

     B:CURRVAL(获取调用NEXTVAL后得到的最后一个值  注意新创建的序列至少调用一次NEXTVAL才可以调用CURRVAL)

       例:

 SELECT SEQ_NUM_1.CURRVAL
  FROM DUAL;

 

案例:使用序列为主键插入值。

INSERT INTO EMP
(EMPNO,ENAME,JOB,SAL)
VALUES
(SEQ_NUM_2.NEXTVAL,LUKK,DRIVER,9999)

结果如下:

技术分享图片

 

重要操作:删除序列(DROP SEQUENCE   序列名)

2.索引

索引:索引是数据库对象之一,索引是为了提高查询效率。

索引的统计与应用都是数据库自动完成的,只要数据库认为可以使某个已创建的索引时就会自动应用。

索引的操作:

              A:创建索引

--创建索引
CREATE INDEX IND_EMP_1 ON EMP(EMPNO);

SELECT EMPTNO,ENAME,SAL FROM EMP
WHERE EMPNO=10
--复合索引
CREATE INDEX IND_EMP_2 ON EMP(EMPNO,sal);
--给类似这种操作时系统就会自动应用索引
SELECT EMPTNO,ENAME,SAL FROM EMP
ORDER BY EMPNO,SAL;
--给函数添加索引
CREATE INDEX IND_EMP_1 ON EMP(UPPER(ENAME));
--给类似这种操作时系统就会自动应用索引
WHERE UPPER(ENAME)=KING;

当你类似于这种操作时,数据库会自动应用索引。

             B: 修改索引(经常操作索引就会不准确,所以定期需要重建索引)

--修改索引
ALTER INDEX IND_EMP_1  REBUILD;

             C:删除索引(索引不合理时,不需要时)

--删除索引
DROP INDEX IND_EMP_1 ;

合理使用索引:

1.不要在小表中建立索引。

2.删除很少被使用,不合理的索引。

3.为经常为经常出现在WHERE子句中 列创建索引。

4.为经常作表的连接条件的列创建索引。

5.不要经常作DML操作的表上建立索引。

 

3.约束

约束:约束是在数据表上强制执行的一些数据校验规则,当执行DML操作时,数据必须符合这些规则 ,如果不符合,无法执行。

约束条件可以保证表中数据完整性,保证数据间的商业逻辑。

          A.非空约束

                创建非空约束

--创建非空约束
CREATE TABLE EMPLOYEES(
EID NUMBER(6),
NAME VARCHAR2(30) NOT NULL,
SALARY NUMBER(7,2),
HIREDATE DATE
CONSTRAINT EMPLOYEES_HIRED NOT NULL        
);

    修改表时添加非空约束

--修改表时添加非空约束
ALTER TABLE EMPLOYEES
MODIFY(EID NUMBER(6)NOT NULL);
DESC EMPLOYEES;

     取消非空约束(设置成null就好)

--取消非空约束
ALTER TABLE EMPLOYEES
MODIFY(EID NUMBER(6) NULL);

            B.唯一性约束(用于保证字段或字段组合不出现重复值)

               当给表中某个字段定义类唯一性约束条件,该列的值不允许重复,但允许是NULL

--唯一性约束
CREATE TABLE EMPLOYEES1(
EID NUMBER(6) UNIQUE,
NAME VARCHAR2(30),
EMAIL VARCHAR2(50),
SALARY NUMBER(7,2),
HIREDATE DATE,
CONSTRAINT EMPLOYEES_EMAIL_UK UNIQUE(EMAIL)
);

测试:

--测试唯一性
INSERT INTO EMPLOYEES1
(EID,EMAIL)
VALUES
(null,null)

结果:

技术分享图片

NULL值被允许。

      在表被建立后 添加唯一性约束条件:

ALTER TABLE EMP
ADD CONSTRAINT EMP UNIQUE(ENAME);

 

     C.主键约束

一个表只有一个主键 非空且唯一。给需要的字段后面加PRIMARY KEY;

    在创建表时添加主键约束:

--主键约束
CREATE TABLE EMPLOYEES2(
EID NUMBER(6)PRIMARY KEY,
NAME VARCHAR2(30),
EMAIL VARCHAR2(50),
SALARY NUMBER(7,2),
HIREDATE DATE
);
--测试主键约束 
INSERT INTO EMPLOYEES1
(EID)
VALUES
(8)

技术分享图片

本次测试故意输入了 不符合的测试主键约束。

 

     建立表后添加主键约束 :

ALTER TABLE EMP
ADD CONSTRAINT EMP PRIMARY KEY;

      D.外键约束

外键约束定义在两个表的字段或一个表的两个字段上,用于保证相关的两个字段关系。

这个用起来太痛了。太痛了。所以不用。

     E.检查约束

检查(CHECK)约束条件用来强制在字段上的每个值都要满足CHECK中定义的条件。

--添加检查约束
ALTER TABLE EMPLOYEES2
ADD CONSTRAINT EMP_SAL
CHECK(SALARY>2000);
--违反约束条件
INSERT INTO EMPLOYEES2
(EID,SALARY)
VALUES
(10,1000)  
-违反约束条件
UPDATE EMPLOYEES2 
SET SALARY=1888
WHERE EID=10;

这些违反约束条件的都会报错。

 

 

数据库结束。

 

以上是关于序列-索引-约束的主要内容,如果未能解决你的问题,请参考以下文章

视图序列索引约束

Oracle中主键外键索引序列唯一性约束的创建

数据库 day60,61 Oracle入门,单行函数,多表查询,子查询,事物处理,约束,rownum分页,视图,序列,索引

在约束布局中查看片段的绑定不起作用

90-预测分析-R语言实现-时间序列1

活动中 TabLayout 内的片段的约束问题