Oracle数据库

文章目录

  • 1. 表的创建
    • (1)创建表的语法
      • 举例1:创建出版社表。
      • 举例2:创建图书表
    • (2)使用DESCRIBE(describe)显示图书表的结构
    • (3)通过子查询创建表
        • 举例
    • (4)设置列的默认值 DEFAULT(default)
        • 举例
    • (5)删除已创建的表
            • 解析CASCADE CONSTRAINTS(cascade constraints)
  • 2. 表的操作
    • (1)表的重命名 RENAME TO
    • (2)清空表TRUNCATE (truncate)
    • (3)添加注释 COMMENT ON TABLE 表名 IS
      • 1. 为表添加注释的语法为:
      • 2. 为列添加注释的语法为:
    • (4)查看表DESCRIBE(describe)
        • 举例
  • 3. 数据完整性和约束条件
    • (1)概念:数据完整性约束
    • (2) 表的五种约束
      • 1. 主键(PRIMARY KEY)
        • 主键约束的语法(表级,列级)如下:
      • 2. 非空(NOT NULL)
      • 3.惟一(UNIQUE)
      • 4.检查(CHECK)
      • 5.外键 FOREIGN KEY(foreing key)
    • (3)约束条件的创建
    • (4) 提交插入的数据 COMMIT:
      • 隐式提交的方式
      • 显式提交
    • (5)恢复删除:
    • (6)查看约束条件
    • (7)使约束生效和失效
      • 使约束条件失效:DISABLE CONSTRANT
      • 使约束条件生效:ENABLE CONSTRANT
  • 4. 修改表结构
    • (1)增加新列
    • (2)修改列
    • (3)删除列
    • (4)UNUSED状态(不会在表中显示出该列)
    • (5)约束条件的修改
      • 1.增加约束条件
      • 2.删除约束条件
  • 5. 分区表
    • (1)分区的作用
    • (2)分区的实例
  • 6. 视图创建和操作
    • (1)视图的概念
    • (2) 视图的创建
    • (3)删除视图
    • (3)创建复杂视图
    • (4)创建只读视图
    • (5)视图的操作
        • 视图的插入
      • 1.视图的插入
      • 2.使用WITH CHECK OPTION选项
      • 3.来自基表的限制
      • 4. 视图的查看
  • 7. 数据查询
    • 1 数据库查询语言SQL
      • (1)**SQL语言有以下的主要特点:**
      • (2)**SQL语言的分类**
    • 2 基本查询和排序
      • (1)查询的基本用法
          • 1.指定检索字段
          • 2.显示行号
          • 3.显示计算列
          • 4.使用别名
          • 5.连接运算符(||)
          • 6.消除重复行 DISTINCT
      • (2)查询结果的排序
          • 1.升序排序
          • 2.降序排序
          • 3.多列排序
          • 4.在排序中使用别名
    • 3 条件查询
      • (1)简单条件查询
          • 1. 比 较 运 算 符
          • 2.group by, having, order by语句的执行顺序
      • (2)复合条件查询
          • 1.使用逻辑与
          • 2.使用逻辑或
          • 3.使用逻辑非
          • 4.使用逻辑或和逻辑与
      • (3)条件特殊表示法
          • 1.BETWEEN的用法
          • 2.IN的用法
          • 3.LIKE的用法
          • 4.判断空值NULL
    • 4 函数
      • (1)数值型函数
        • **【训练1】 使用数值型函数练习。**
            • **步骤1:使用求绝对值函数abs。**
            • **步骤2:使用求平方根函数sqrt。**
            • **步骤3:使用ceil函数。**
            • **步骤4:使用floor函数。**
            • **步骤5:使用四舍五入函数round。**
            • **步骤6:使用截断函数trunc。**
            • **步骤7:使用求余数函数mod。**
            • **步骤8:使用cos函数。**
        • **【训练2】 求|sin(230o)|的值,保留一位小数。**
            • 步骤1:执行查询。
            • **步骤2:求绝对值。**
      • (2)字符型函数
        • 举例
      • (3)日期型函数
      • (4)转换函数
          • 1.自动类型转换
          • 2.日期类型转换
      • (5)数字类型转换
      • (6)其他函数
          • 1.空值的转换
          • 2.decode函数
          • 3.userenv函数
    • 5 高级查询
      • (1)多表联合查询
          • 1.相等连接
          • 2.外连接
            • **Ⅰ 右外连接**
            • **Ⅱ 左外连接**
          • 3.不等连接
          • 4.自连接
      • (2)统计查询
          • 1.统计查询
          • 2.分组统计
          • 3.多列分组统计
          • 4.分组统计结果限定
          • 5.分组统计结果排序
      • (3)子查询
          • 1.单行子查询
          • 2.多行子查询
          • 3.多列子查询
          • 4.在FROM从句中使用子查询
      • (4)集合运算
          • 1.使用集合的并运算
          • 2.使用集合的交运算
          • 3.使用集合的差运算(minus)
  • 8. 数据操作
    • 1 数据库操作语句
      • (1)插入数据
          • 1.数据插入基本语法
          • 2.复制数据
          • 3.使用序列
      • (2)修改数据
          • (1) 修改数据的语句UPDATE的基本语法如下:
          • (2) UPDATE语句的另外一种用法:
      • (3)删除数据
    • 2 数据库事务
      • (1)数据库事务的概念
      • (2)数据库事务的应用
    • 3 表的锁定
          • 1.锁的概念
          • 2 隐式锁和显式锁
          • 3.锁定行
          • 4.锁定表

1. 表的创建

(1)创建表的语法

表的创建需要CREATE TABLE 系统权限,创建表的基本创建语法如下:

CREATE TABLE 表名
		(列名 数据类型(宽度)[DEFAULT 表达式][COLUMN CONSTRAINT],
		...
		[TABLE CONSTRAINT]
		[TABLE_PARTITION_CLAUSE]
		)
  • 表名最大长度为30个字符。在同一个用户下,表不能重名,但不同用户表的名称可以相重。另外,表的名称不能使用Oracle的保留字。在一张表中最多可以包含2000列。该语法中的其他部分根据需要添加,作用如下:
    DEFAULT 表达式:用来定义列的默认值。
    COLUMN CONSTRAINT:用来定义列级的约束条件。
    TABLE CONSTRAINT:用来定义表级的约束条件。
    TABLE_PARTITION_CLAUSE:定义表的分区子句。

举例1:创建出版社表。

	步骤1:创建出版社表,输入并执行以下命令:
CREATE TABLE 出版社(
		编号 VARCHAR2(2),
		出版社名称 VARCHAR2(30),
		地址 VARCHAR2(30),
		联系电话 VARCHAR2(20)
		);

举例2:创建图书表

CREATE TABLE 图书(
图书编号 VARCHAR2(5),
图书名称 VARCHAR2(30),
出版社编号 VARCHAR2(2),
作者 VARCHAR2(10),
出版日期 DATE,
数量 NUMBER(3),
单价 NUMBER(7,2)
);

(2)使用DESCRIBE(describe)显示图书表的结构

DESCRIBE 图书
	执行结果为:
	名称                                      是否为空? 类型
	 ----------------------------------------------------- --------------------- -------------------------
	图书编号                                           VARCHAR2(5)
	图书名称                                           VARCHAR2(30)
	 出版社编号                                         VARCHAR2(2)
	 作者                                               VARCHAR2(10)
	 出版日期                                           DATE
	 数量                                               NUMBER(3)
	 单价                                               NUMBER(7,2)

(3)通过子查询创建表

  • 如果要创建一个同已有的表结构相同或部分相同的表,可以采用以下的语法:
CREATE TABLE 表名(列名...) AS SQL查询语句;
  • 该语法既可以复制表的结构,也可以复制表的内容,并可以为新表命名新的列名。新的列名在表名后的括号中给出,如果省略将采用原来表的列名。复制的内容由查询语句的WHERE条件决定。
举例

通过子查询创建新的图书表。

  • 步骤1:完全复制图书表到“图书1”,输入并执行以下命令:
CREATE TABLE 图书1 AS SELECT * FROM 图书;

说明:“图书1”表的内容和结构同“图书”表完全一致,相当于表的复制。

  • 步骤2:创建新的图书表“图书2”,只包含书名和单价,输入并执行以下命令:
CREATE TABLE 图书2(书名,单价) AS SELECT 图书名称,单价 FROM 图书;

图书2表只包含“图书”表的两列 “图书名称”和“单价”,并且对字段重新进行了命名

  • 步骤3:创建新的图书表“图书3”,只包含书名和单价,不复制内容,输入并执行以下命令:
CREATE TABLE 图书3(书名,单价) AS SELECT 图书名称,单价 FROM 图书 WHERE 1=2;

“图书3”表同“图书2”表的结构一样,但表的内容为空。因为WHERE条件始终为假

(4)设置列的默认值 DEFAULT(default)

  • 可以在创建表的同时指定列的默认值,这样在插入数据时,如果不插入相应的列,则该列取默认值,默认值由DEFAULT部分说明。
举例

创建表时,设置表的默认值。

CREATE TABLE 图书4(
		图书编号 VARCHAR2(5) DEFAULT NULL,
		图书名称 VARCHAR2(30) DEFAULT '未知',
		出版社编号 VARCHAR2(2) DEFAULT NULL,
		出版日期 DATE DEFAULT '01-1月-1900',
		作者 VARCHAR2(10) DEFAULT NULL,
		数量 NUMBER(3) DEFAULT 0,
		单价 NUMBER(7,2) DEFAULT NULL,
		借出数量 NUMBER(3) DEFAULT 0
		);

(5)删除已创建的表

  • 删除表的语法如下:
DROP TABLE 表名[CASCADE CONSTRAINTS]
  • 表的删除者必须是表的创建者或具有DROP ANY TABLE权限。CASCADE CONSTRAINTS表示当要删除的表被其他表参照时,删除参照此表的约束条件。
解析CASCADE CONSTRAINTS(cascade constraints)

CASCADE CONSTRAINTS是在删除数据库中某个表时,当该表的某些列作为外键被其他表所引用时,级联删除参照该表的约束条件。下面是一个简单的例子:
假设有两张表,员工表和薪资表,员工表的主键是员工编号,薪资表中的员工编号是外键,参照员工表的主键。当我们想要删除员工表时,由于薪资表中的员工编号是外键,我们需要先删除薪资表中的数据,否则删除员工表时会出现错误。
使用CASCADE CONSTRAINTS关键字可以实现级联删除。具体操作如下:
sql

-- 创建员工表
CREATE TABLE t_employee (
  emp_id INT PRIMARY KEY,
  emp_name VARCHAR2(50) NOT NULL
);
-- 创建薪资表
CREATE TABLE t_salary (
  salary_id INT PRIMARY KEY,
  emp_id INT,
  salary NUMBER,
  FOREIGN KEY (emp_id) REFERENCES t_employee(emp_id)
);
-- 删除员工表时使用CASCADE CONSTRAINTS关键字
DROP TABLE t_employee CASCADE CONSTRAINTS;

在上述例子中,删除员工表时,CASCADE CONSTRAINTS关键字会自动删除参照该表的外键约束,即删除t_salary表中的emp_id外键约束。因此,我们不需要手动先删除薪资表中的数据,也不需要手动删除外键约束,就可以顺利删除员工表。
如果不加CASCADE CONSTRAINTS会怎样
如果在DROP TABLE语句中不使用CASCADE CONSTRAINTS选项,而该表又有其他表的外键关联到该表的主键上,那么将无法删除该表,系统会抛出ORA-02449错误。此时需要先手动删除其他表中关联到该表主键的外键,或者使用CASCADE CONSTRAINTS选项删除其他表中的数据和外键约束,才能成功删除该表。如果不解决外键约束问题,就无法删除该表。

2. 表的操作

(1)表的重命名 RENAME TO

语法如下:

RENAME 旧表名 TO 新表名;
  • 只有表的拥有者,才能修改表名。
    【训练1】 修改“图书”表为“图书5”表:
RENAME 图书 TO 图书5;

(2)清空表TRUNCATE (truncate)

清空表的语法为:

TRUNCATE TABLE 表名;

清空表可删除表的全部数据并释放占用的存储空间。

(3)添加注释 COMMENT ON TABLE 表名 IS

1. 为表添加注释的语法为:

COMMENT ON TABLE 表名 IS '...';

该语法为表添加注释字符串。如IS后的字符串为空,则清除表注释。

 #为emp表添加注释:“公司雇员列表”。
COMMENT ON TABLE emp IS '公司雇员列表';

2. 为列添加注释的语法为:

COMMENT ON COLUMN 表名.列名 IS '...'

该语法为列添加注释字符串。如IS后的字符串为空,则清除列注释。

         #  为emp表的deptno列添加注释:“部门编号”。
		COMMENT ON COLUMN emp.deptno IS '部门编号';

(4)查看表DESCRIBE(describe)

  • 使用以下语法可查看表的结构:
DESCRIBE 表名;

DESCRIBE可以简写为DESC
可以通过对数据字典USER_OBJECTS的查询,显示当前模式用户的所有表。

举例

显示当前用户的所有表。

SELECT object_name FROM user_objects WHERE object_type='TABLE';

3. 数据完整性和约束条件

(1)概念:数据完整性约束

  • 表的数据有一定的取值范围和联系,多表之间的数据有时也有一定的参照关系。在创建表和修改表时,可通过定义约束条件来保证数据的完整性和一致性。约束条件是一些规则,在对数据进行插入、删除和修改时要对这些规则进行验证,从而起到约束作用。
  • 完整性包括数据完整性和参照完整性,数据完整性定义表数据的约束条件,参照完整性定义数据之间的约束条件。数据完整性由主键(PRIMARY KEY)、非空(NOT NULL)、惟一(UNIQUE)和检查(CHECK)约束条件定义,参照完整性由外键(FOREIGN KEY)约束条件定义。

(2) 表的五种约束

表共有五种约束,它们是主键、非空、惟一、检查和外键。

1. 主键(PRIMARY KEY)

  • 主键是表的主要完整性约束条件,主键惟一地标识表的每一行。
  • 一般情况下表都要定义主键,而且一个表只能定义一个主键。
  • 主键可以包含表的一列或多列,如果包含表的多列,则需要在表级定义。
  • 主键包含了主键每一列的非空约束和主键所有列的惟一约束。
  • 主键一旦成功定义,系统将自动生成一个B树惟一索引,用于快速访问主键列。比如图书表中 * 用“图书编号”列作主键,“图书编号”可以惟一地标识图书表的每一行。
主键约束的语法(表级,列级)如下:
[CONSTRANT 约束名] PRIMARY KEY					--列级
[CONSTRANT 约束名] PRIMARY KEY(列名1,列名2,...)	--表级

2. 非空(NOT NULL)

非空约束指定某列不能为空,它只能在列级定义。在默认情况下,Oracle允许列的内容为空值。比如“图书名称”列要求必须填写,可以为该列设置非空约束条件。
非空约束语法如下:

[CONSTRANT 约束名] NOT NULL					--列级

3.惟一(UNIQUE)

惟一约束条件要求表的一列或多列的组合内容必须惟一,即不相重,可以在列级或表级定义。但如果惟一约束包含表的多列,则必须在表级定义。比如出版社表的“联系电话”不应该重复,可以为其定义惟一约束。
惟一约束的语法如下:

[CONSTRANT 约束名] UNIQUE						--列级
[CONSTRANT 约束名] UNIQUE(列名1,列名2,...)		--表级

4.检查(CHECK)

  • 检查约束条件是用来定义表的一列或多列的一个约束条件,使表的每一列的内容必须满足该条件(列的内容为空除外)。
  • 在CHECK条件中,可以调用SYSDATE、USER等系统函数。
  • 一个列上可以定义多个CHECK约束条件,一个CHECK约束可以包含一列或多列。
  • 如果CHECK约束包含表的多列,则必须在表级定义。
  • 比如图书表的“单价”的值必须大于零,就可以设置成CHECK约束条件。

检查约束的语法如下:

[CONSTRANT 约束名] CHECK(约束条件)  --列级,约束条件中只包含本列
[CONSTRANT 约束名] CHECK(约束条件)  --表级,约束条件中包含多列

CHECK详细举例
列级

-- 创建一个学生表
CREATE TABLE student (
  id INT PRIMARY KEY,
  name VARCHAR2(50),
  age INT,
  gender CHAR(1),
  grade FLOAT,
  CONSTRAINT age_check CHECK (age >= 18 AND age <= 30),
  CONSTRAINT gender_check CHECK (gender IN ('M', 'F')),
  CONSTRAINT grade_check CHECK (grade >= 0 AND grade <= 100)
);

表级

-- 创建一个员工表
CREATE TABLE employee (
  emp_id INT PRIMARY KEY,
  emp_name VARCHAR2(50) NOT NULL,
  emp_gender CHAR(1) NOT NULL,
  emp_age INT,
  emp_salary FLOAT,
  CONSTRAINT salary_check CHECK (emp_salary >= 0),
  CONSTRAINT age_gender_check CHECK ((emp_gender = 'M' AND emp_age >= 18 AND emp_age <= 65) OR (emp_gender = 'F' AND emp_age >= 18 AND emp_age <= 60))
);

5.外键 FOREIGN KEY(foreing key)

  • 指定表的一列或多列的组合作为外键,外键参照指定的主键或惟一键。外键的值可以为NULL,如果不为NULL,就必须是指定主键或惟一键的值之一。外键通常用来约束两个表之间的数据关系,这两个表含有主键或惟一键的称为主表,定义外键的那张表称为子表。如果外键只包含一列,则可以在列级定义;如果包含多列,则必须在表级定义。
  • 外键的列的个数、列的数据类型和长度,应该和参照的主键或惟一键一致。比如图书表的“出版社编号”列,可以定义成外键,参照出版社表的“编号”列,但“编号”列必须先定义成为主键或惟一键。如果外键定义成功,则出版社表称为主表,图书表称为子表。在表的创建过程中,应该先创建主表,后创建子表。

外键约束的语法如下:
oreign key (要设为外键的列名) references 表2-表名(与哪个表有关联) (表2中该列列名);
(references)

  • 第一种语法,如果子记录存在,则不允许删除主记录:
[CONSTRANT 约束名] FOREIGN KEY(列名1,列名2,...)REFERENCES 表名(列名1,列名2,...)
  • 第二种语法,如果子记录存在,则删除主记录时,级联删除子记录:
[CONSTRANT 约束名] FOREIGN KEY(列名1,列名2,...)REFERENCES 表名(列名1,列名2,...)on delete cascade 
  • 第三种语法,如果子记录存在,则删除主记录时,将子记录置成空:
[CONSTRANT 约束名] FOREIGN KEY(列名1,列名2,...)REFERENCES 表名(列名1,列名2,...)on delete set null
# 其中的表名为要参照的表名。

在以上5种约束的语法中,CONSTRANT关键字用来定义约束名,如果省略,则系统自动生成以SYS_开头的惟一约束名。约束名的作用是当发生违反约束条件的操作时,系统会显示违反的约束条件名称,这样用户就可以了解到发生错误的原因。

(3)约束条件的创建

在表的创建语法中可以定义约束条件:

CREATE TABLE 表名(列名 数据类型[DEFAULT 表达式][COLUMN CONSTRAINT],...
	[TABLE CONSTRAINT]
	)

其中,COLUMN CONSTRAINT用来定义列级约束条件;TABLE CONSTRAINT用来定义表级约束条件。

创建带有约束条件的出版社表(如果已经存在,先删除):

CREATE TABLE 出版社(
		编号 VARCHAR2(2) CONSTRAINT PK_1 PRIMARY KEY,
		出版社名称 VARCHAR2(30) NOT NULL ,
		地址 VARCHAR2(30) DEFAULT '未知',
		联系电话 VARCHAR2(20)
		);

创建带有约束条件(包括外键)的图书表(如果已经存在,先删除):

		CREATE TABLE 图书(
		图书编号 VARCHAR2(5) CONSTRAINT PK_2 PRIMARY KEY,
		图书名称 VARCHAR2(30) NOT NULL,
		出版社编号 VARCHAR2(2) CHECK(LENGTH(出版社编号)=2) NOT NULL,
		作者 VARCHAR2(10) DEFAULT '未知',
		出版日期 DATE DEFAULT '01-1月-1900',
		数量 NUMBER(3) DEFAULT 1 CHECK(数量>0),
		单价 NUMBER(7,2),
		CONSTRAINT YS_1 UNIQUE(图书名称,作者),
		CONSTRAINT FK_1 FOREIGN KEY(出版社编号) REFERENCES 出版社表名(编号) ON DELETE CASCADE
		);

说明:

  • 因为两个表同属于一个用户,故约束名不能相重,图书表的主键为“图书编号”列,主键名为PK_2。
  • 其中,约束条件CHECK(LENGTH(出版社编号)=2)表示出版社编号的长度必须是2,约束条件UNIQUE(图书名称,作者)表示“图书名称”和“作者”两列的内容组合必须惟一。
  • FOREIGN KEY(出版社编号) REFERENCES 出版社(编号) 表示图书表的“出版社编号”列参照出版社的“编号”主键列。出版社表为主表,图书表为子表,出版社表必须先创建。
  • ON DELETE CASCADE表示当删除出版社表的记录时,图书表中的相关记录同时删除,比如删除清华大学出版社,则图书表中清华大学出版社的图书也会被删除。
  • 如果同时出现DEFAULTCHECK,则DEFAULT需要出现在CHECK约束条件之前。

测试

INSERT INTO 出版社 VALUES('01','电子科技大学出版社','西安','029-88201467');
		执行结果:
		ERROR 位于第1行:
		ORA-00001: 违反惟一约束条件 (SCOTT.PK_1)

第二个插入语句违反约束条件PK_1,即出版社表的主键约束,原因是主键的值必须是惟一的。

(4) 提交插入的数据 COMMIT:

COMMIT;

注意:

  • 在数据库的插入、删除和修改操作时,只有当事务在提交到数据库时才算完成。在Oracle 数据库中,在事务提交前,只有操作数据库的这个人才能有权看到所做的事情,别人只有在最后提交完成时才能看见。
    隐式提交的定义
    又名自动提交,即无需显示执行commit语句,session中的操作被自动提交到数据库的过程。

隐式提交的方式

1、正常执行完ddl语句。包括createalterdroptruncaterename

2、正常执行完dcl语句。包括grantrevoke

3、正常退出isql*plus,没有明确发出commit或者rollback

隐式提交的注意事项

1、执行ddl语句时,前面的dml操作也会被提交到数据库中

因为是在一个session里,那执行ddl语句的时候前面的dml语句肯定也会“不可幸免”的被提交到库中。

2、即使ddl语句执行失败,前面的dml操作也会被提交到数据库中

这就有点儿让人奇怪了,ddl都执行失败了,怎么还会提交呢?这就需要探究一下隐式提交的本质了(下文有叙述)。

3、在前面1和2的基础上总结

为了避免隐式提交或者回滚,尽量保证一条或者几条DML操作完成后有显示的提交或者回滚,防止后续执行的DCL或者DDL自动提交前期的DML操作。

隐式提交的本质

1、一条ddl语句执行了两次commit

commit;

ddl statement;

commit;

第一个commit将当前session中未提交的事务隐式提交,以保证ddl语句失败时的回滚位置。

第二个commit将ddl

2、为什么需要隐式提交?

为了保证事务的一致性。我们在执行ddl语句的时候,oracle需要在它的系统表中进行元数据的记录操作(即:除了建表还会进行不少insert操作),如果它不隐式提交就无法保证一致性;从内部运行机制来看ddl语句和dml语句还是有很大区别的,dml会对每个语句的每条记录都做日志记录以便于回滚,而ddl往往没必要搞这么复杂,从功能和易用性上看隐式提交都是最好的选择。

显式提交

COMMIT命令直接完成的提交为显式提交。其格式为:

SQL>COMMIT

(2) 自动提交
若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,
系统将自动进行提交,这就是自动提交。其语法为:

SQL>SET AUTOCOMMIT ON

(5)恢复删除:

ROLLBACK

回退已完成。

  • 说明:参见训练2,外键约束FK_1带有ON DELETE CASCAD选项,删除清华大学出版社时,对应的图书也自动删除。其他两种情况用户可自行验证。

(6)查看约束条件

数据字典USER_CONSTRAINTS中包含了当前模式用户的约束条件信息。其中,CONSTRAINTS_TYPE 显示的约束类型为:
C:CHECK约束。
P:PRIMARY KEY约束。
U:UNIQUE约束。
R:FOREIGN KEY约束。
其他信息可根据需要进行查询显示,可用DESCRIBE命令查看USER_CONSTRAINTS的结构。

举例:检查表的约束信息:

SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,SEARCH_CONDITION FROM USER_CONSTRAINTS
WHERE TABLE_NAME='图书';

执行结果:
CONSTRAINT_NAME C SEARCH_CONDITION
SYS_ C003111 C “图书名称” IS NOT NULL
SYS_C003112 C “出版社编号” IS NOT NULL
SYS_C003113 C LENGTH(出版社编号)=2
SYS_C003114 C 数量>0
PK_2 P
YS_1 U
FK_1 R

  • 说明:图书表共有7个约束条件,一个PRIMARY KEY(P)约束PK_2,一个FOREIGN KEY(R)约束FK_1,一个UNIQUE®约束YS_1和4个CHECK©约束SYS_C003111、SYS_C003112、SYS_C003113和SYS_C003114,4个CHECK约束的名字是由系统命名的。

(7)使约束生效和失效

  • 约束的作用是保护数据完整性,但有的时候约束的条件可能不再适用或没有必要,如果这个约束条件依然发生作用就会影响操作的效率,比如导出和导入数据时要暂时关闭约束条件,这时可以使用下面的命令关闭或打开约束条件。

使约束条件失效:DISABLE CONSTRANT

ALTER TABLE 表名 DISABLE CONSTRANT 约束名;

使约束条件生效:ENABLE CONSTRANT

ALTER TABLE 表名 ENABLE CONSTRANT 约束名;

1. 举例:
使图书表的数量检查失效。
步骤1:使约束条件SYS_C003114(数量>0)失效:

ALTER TABLE 图书 DISABLE CONSTRAINT SYS_C003114;

执行结果:
表已更改。
步骤2:修改数量为0:

UPDATE 图书 SET 数量=0 WHERE 图书编号='A0001';

执行结果:
已更新 1 行。

步骤3:使约束条件SYS_C003114生效:

ALTER TABLE 图书 ENABLE CONSTRAINT SYS_C003114;

执行结果:
ERROR 位于第 1 行:
ORA-02293: 无法验证 (SCOTT.SYS_C003114) - 违反检查约束条件
继续执行:

UPDATE 图书 SET 数量=5 WHERE 图书编号='A0001';

执行结果:
已更新 1 行。

继续执行:

ALTER TABLE 图书 ENABLE CONSTRAINT SYS_C003114;

执行结果:
表已更改。

  • 说明:在步骤1中,先使名称为SYS_C003114 (数量>0)的检查条件暂时失效,所以步骤2修改第1条记录的数量为0才能成功。步骤3使该约束条件重新生效,但因为表中有数据不满足该约束条件,所以发生错误,通过修改第一条记录的数量为5,使约束条件重新生效。

4. 修改表结构

(1)增加新列

增加新列的语法如下:

ALTER TABLE 表名
ADD 列名 数据类型[DEFAULT 表达式][COLUMN CONSTRAINT];

如果要为表同时增加多列,可以按以下格式进行:

ALTER TABLE 表名
ADD (列名 数据类型[DEFAULT 表达式][COLUMN CONSTRAINT]...);
  • 通过增加新列可以指定新列的数据类型、宽度、默认值和约束条件。增加的新列总是位于表的最后。假如新列定义了默认值,则新列的所有行自动填充默认值。对于有数据的表,新增加列的值为NULL,所以有数据的表,新增加列不能指定为NOT NULL约束条件

举例:

#为“出版社”增加一列“电子邮件”:
		ALTER TABLE 出版社
		ADD 电子邮件 VARCHAR2(30) CHECK(电子邮件 LIKE '%@%');
  • 说明:为出版社新增加了一列“电子邮件”,数据类型为VARCHAR2,宽度为30。CHECK(电子邮件 LIKE '%@%')表示电子邮件中必须包含字符“@”。可用DESCRIBE命令查看表的新结构。

(2)修改列

修改列的语法如下:

ALTER TABLE 表名
MODIFY 列名 数据类型 [DEFAULT 表达式][COLUMN CONSTRAINT]

如果要对表同时修改多列,可以按以下格式进行:

ALTER TABLE 表名
MODIFY (列名 数据类型[DEFAULT 表达式][COLUMN CONSTRAINT]...);
  • 其中,列名是要修改的列的标识,不能修改。如果要改变列名,只能先删除该列,然后重新增加。其他部分都可以进行修改,如果没有给出新的定义,表示该部分属性不变。
    修改列定义还有以下一些特点:
    (1) 列的宽度可以增加或减小,在表的列没有数据或数据为NULL时才能减小宽度。
    (2) 在表的列没有数据或数据为NULL时才能改变数据类型,CHAR和VARCHAR2之间可以随意转换。
    (3) 只有当列的值非空时,才能增加约束条件NOT NULL。
    (4) 修改列的默认值,只影响以后插入的数据。

举例: 修改“出版社”表“电子邮件”列的宽度为40。

ALTER TABLE 出版社
	MODIFY 电子邮件 VARCHAR2(40);

(3)删除列

删除列的语法如下:

ALTER TABLE 表名

你可能感兴趣的:(oracle,数据库)