表的创建需要CREATE TABLE 系统权限,创建表的基本创建语法如下:
CREATE TABLE 表名
(列名 数据类型(宽度)[DEFAULT 表达式][COLUMN CONSTRAINT],
...
[TABLE CONSTRAINT]
[TABLE_PARTITION_CLAUSE]
);
步骤1:创建出版社表,输入并执行以下命令:
CREATE TABLE 出版社(
编号 VARCHAR2(2),
出版社名称 VARCHAR2(30),
地址 VARCHAR2(30),
联系电话 VARCHAR2(20)
);
CREATE TABLE 图书(
图书编号 VARCHAR2(5),
图书名称 VARCHAR2(30),
出版社编号 VARCHAR2(2),
作者 VARCHAR2(10),
出版日期 DATE,
数量 NUMBER(3),
单价 NUMBER(7,2)
);
DESCRIBE 图书
执行结果为:
名称 是否为空? 类型
----------------------------------------------------- --------------------- -------------------------
图书编号 VARCHAR2(5)
图书名称 VARCHAR2(30)
出版社编号 VARCHAR2(2)
作者 VARCHAR2(10)
出版日期 DATE
数量 NUMBER(3)
单价 NUMBER(7,2)
CREATE TABLE 表名(列名...) AS SQL查询语句;
通过子查询创建新的图书表。
CREATE TABLE 图书1 AS SELECT * FROM 图书;
说明:“图书1”表的内容和结构同“图书”表完全一致,相当于表的复制。
CREATE TABLE 图书2(书名,单价) AS SELECT 图书名称,单价 FROM 图书;
图书2表只包含“图书”表的两列 “图书名称”和“单价”,并且对字段重新进行了命名
CREATE TABLE 图书3(书名,单价) AS SELECT 图书名称,单价 FROM 图书 WHERE 1=2;
“图书3”表同“图书2”表的结构一样,但表的内容为空。因为WHERE条件始终为假
创建表时,设置表的默认值。
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
);
DROP TABLE 表名[CASCADE CONSTRAINTS];
DROP ANY TABLE
权限。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
选项删除其他表中的数据和外键约束,才能成功删除该表。如果不解决外键约束问题,就无法删除该表。
语法如下:
RENAME 旧表名 TO 新表名;
RENAME 图书 TO 图书5;
清空表的语法为:
TRUNCATE TABLE 表名;
清空表可删除表的全部数据并释放占用的存储空间。
COMMENT ON TABLE 表名 IS '...';
该语法为表添加注释字符串。如IS后的字符串为空,则清除表注释。
#为emp表添加注释:“公司雇员列表”。
COMMENT ON TABLE emp IS '公司雇员列表';
COMMENT ON COLUMN 表名.列名 IS '...'
该语法为列添加注释字符串。如IS后的字符串为空,则清除列注释。
# 为emp表的deptno列添加注释:“部门编号”。
COMMENT ON COLUMN emp.deptno IS '部门编号';
DESCRIBE 表名;
DESCRIBE
可以简写为DESC
。
可以通过对数据字典USER_OBJECTS
的查询,显示当前模式用户的所有表。
显示当前用户的所有表。
SELECT object_name FROM user_objects WHERE object_type='TABLE';
PRIMARY KEY
)、非空(NOT NULL
)、惟一(UNIQUE
)和检查(CHECK
)约束条件定义,参照完整性由外键(FOREIGN KEY
)约束条件定义。表共有五种约束,它们是主键、非空、惟一、检查和外键。
[CONSTRANT 约束名] PRIMARY KEY --列级
[CONSTRANT 约束名] PRIMARY KEY(列名1,列名2,...) --表级
非空约束指定某列不能为空,它只能在列级定义。在默认情况下,Oracle允许列的内容为空值。比如“图书名称”列要求必须填写,可以为该列设置非空约束条件。
非空约束语法如下:
[CONSTRANT 约束名] NOT NULL --列级
惟一约束条件要求表的一列或多列的组合内容必须惟一,即不相重,可以在列级或表级定义。但如果惟一约束包含表的多列,则必须在表级定义。比如出版社表的“联系电话”不应该重复,可以为其定义惟一约束。
惟一约束的语法如下:
[CONSTRANT 约束名] UNIQUE --列级
[CONSTRANT 约束名] UNIQUE(列名1,列名2,...) --表级
检查约束的语法如下:
[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))
);
外键约束的语法如下:
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_
开头的惟一约束名。约束名的作用是当发生违反约束条件的操作时,系统会显示违反的约束条件名称,这样用户就可以了解到发生错误的原因。
在表的创建语法中可以定义约束条件:
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
);
说明:
CHECK(LENGTH(出版社编号)=2)
表示出版社编号的长度必须是2,约束条件UNIQUE(图书名称,作者)
表示“图书名称”和“作者”两列的内容组合必须惟一。FOREIGN KEY(出版社编号) REFERENCES 出版社(编号)
表示图书表的“出版社编号”列参照出版社的“编号”主键列。出版社表为主表,图书表为子表,出版社表必须先创建。ON DELETE CASCADE
表示当删除出版社表的记录时,图书表中的相关记录同时删除,比如删除清华大学出版社,则图书表中清华大学出版社的图书也会被删除。DEFAULT
和CHECK
,则DEFAULT
需要出现在CHECK
约束条件之前。测试
INSERT INTO 出版社 VALUES('01','电子科技大学出版社','西安','029-88201467');
执行结果:
ERROR 位于第1行:
ORA-00001: 违反惟一约束条件 (SCOTT.PK_1)
第二个插入语句违反约束条件PK_1,即出版社表的主键约束,原因是主键的值必须是惟一的。
COMMIT;
注意:
1、正常执行完ddl语句。包括create
,alter
,drop
,truncate
,rename
。
2、正常执行完dcl语句。包括grant
,revoke
。
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;
ROLLBACK;
回退已完成。
数据字典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
一个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约束的名字是由系统命名的。ALTER TABLE 表名 DISABLE 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;
执行结果:
表已更改。
增加新列的语法如下:
ALTER TABLE 表名
ADD 列名 数据类型[DEFAULT 表达式][COLUMN CONSTRAINT];
如果要为表同时增加多列,可以按以下格式进行:
ALTER TABLE 表名
ADD (列名 数据类型[DEFAULT 表达式][COLUMN CONSTRAINT]...);
举例:
#为“出版社”增加一列“电子邮件”:
ALTER TABLE 出版社
ADD 电子邮件 VARCHAR2(30) CHECK(电子邮件 LIKE '%@%');
VARCHAR2
,宽度为30。CHECK(电子邮件 LIKE '%@%')
表示电子邮件中必须包含字符“@”。可用DESCRIBE
命令查看表的新结构。修改列的语法如下:
ALTER TABLE 表名
MODIFY 列名 数据类型 [DEFAULT 表达式][COLUMN CONSTRAINT]
如果要对表同时修改多列,可以按以下格式进行:
ALTER TABLE 表名
MODIFY (列名 数据类型[DEFAULT 表达式][COLUMN CONSTRAINT]...);
举例: 修改“出版社”表“电子邮件”列的宽度为40。
ALTER TABLE 出版社
MODIFY 电子邮件 VARCHAR2(40);
删除列的语法如下:
ALTER TABLE 表名