3.3 创建数据表 |
![]() |
在创建完数据库之后,接下来的工作就是创建数据表。所谓创建数据表,指的是在已经创建好的数据库中建立新表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和字段完整性等)约束的过程。本节将介绍创建数据表的语法形式,如何添加主键约束、外键约束、非空约束等。
创建数据表的语句为CREATE TABLE,语法规则如下:
使用CREATE TABLE创建数据表时必须指定以下信息:
(1)要创建的数据表的名称,不区分字母大小写,不能使用SQL语言中的关键字,如DROP、ALTER、INSERT等。
(2)数据表中每一个列(字段)的名称和数据类型,如果创建多个列,就要用逗号隔开。
【例3.1】创建员工表tb_emp1,结构如表3-1所示。
表3-1 tb_emp1表结构
创建tb_emp1表,SQL语句为:
上述语句执行成功后,便创建了一个名为tb_emp1的数据表。若要使用SQL的DESC语句查看数据表是否创建成功,可执行如下的SQL语句并查看执行结果:
可以看到,数据库中已经有了数据表tb_tmp1,表明该数据表创建成功。
主键又称主码,是表中一列或多列的组合。主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空。主键能够唯一地标识表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度。主键和记录之间的关系如同身份证和人之间的关系,它们之间是一一对应的。主键分为两种类型:单字段主键和多字段联合主键。
主键由一个字段组成,SQL语句格式分为以下两种情况:
(1)在定义列的同时指定主键,语法规则如下:
字段名 数据类型PRIMARY KEY [默认值]
【例3.2】定义数据表tb_emp 2,其主键为id,SQL语句如下:
(2)在定义完所有列之后指定主键,可采用如下的语法规则:
[CONSTRAINT <约束名>] PRIMARY KEY [字段名]
【例3.3】定义数据表tb_emp 3,其主键为id,SQL语句如下:
上述两个例子执行后的结果是一样的,都会在id字段上设置主键约束。
主键由多个字段联合组成,语法规则如下:
PRIMARY KEY [字段1, 字段2,..., 字段n]
【例3.4】定义数据表tb_emp4,假设表中没有主键id,为了唯一确定一个员工,把name、deptId联合起来作为主键,SQL语句如下:
上述语句执行完成后,便创建了一个名为tb_emp4的数据表,name字段和deptId字段组合在一起成为tb_emp4的多字段联合主键。
在创建数据表时如果没有添加主键约束,则可以在修改数据表时为表添加主键约束。添加主键约束的语法格式如下:
ALTER TABLE数据表名称 ADD CONSTRAINTS约束名称PRIMARY KEY(字段名称)
【例3.5】定义数据表tb1_emp 1,修改其主键为id,创建数据表的SQL语句如下:
若要通过ALTER TABLE修改id为主键,可执行如下的SQL语句:
ALTER TABLE tb1_emp1 ADD CONSTRAINTS pk_id PRIMARY KEY(id);
对于不需要的主键约束,可以将其移除,具体的语法格式如下:
ALTER TABLE数据表名称 DROP CONSTRAINTS约束名称
【例3.6】若要移除数据表tb1_emp 1的主键约束pk_id,可执行如下的SQL语句:
ALTER TABLE tb1_emp1 DROP CONSTRAINTS pk_id;
上述语句执行完成后,即可成功移除主键约束pk_id。
外键用来在两个数据表的数据之间建立链接,它可以是一列或者多列。一个数据表可以有一个或多个外键。外键对应的是引用完整性,一个数据表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个数据表中主键的某个值。
外键:首先它是数据表中的一个字段,可以不是本数据表的主键,但对应另一个数据表的主键。外键的主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个数据表中具有关联关系的行。外键的作用是保持数据的一致性、完整性。例如,部门表tb_dept1的主键是id,在员工表tb_emp5中有一个键deptId与这个id关联。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个数据表即为主表。
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个数据表即为从表。
创建外键的语法规则如下:
[CONSTRAINT <外键名>] FOREIGN KEY字段名1 [ ,字段名2,…] REFERENCES <主表名> 主键列1 [ ,主键列2,…]
“外键名”为定义的外键约束的名称,一个数据表中不能有相同名称的外键;“字段名”表示子表需要添加外键约束的字段列;“主表名”即被子表外键所依赖的数据表的名称;“主键列”表示主表中定义的主键列或者列组合。
【例3.7】定义数据表tb_emp5,并在tb_emp5表上创建外键约束。
若要创建表结构如表3-2所示的一个部门表tb_dept1,可执行如下的SQL语句:
表3-2 tb_dept1表结构
定义数据表tb_emp5,让它的键deptId作为外键关联到tb_dept1的主键id,执行如下的SQL语句:
以上语句执行成功之后,在表tb_emp5上添加了名为fk_emp_dept1的外键约束,外键名为deptId,其依赖于表tb_dept1的主键id。
提 示
关联指的是在关系型数据库中,相关表之间的联系。它是通过相容或相同的属性或属性组来表示的。子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,在创建子表时就会出现错误。
在创建数据表时如果没有添加外键约束,可以在修改表时为表添加外键约束。添加外键约束的语法格式如下:
ALTER TABLE数据表名称 ADD CONSTRAINTS约束名称FOREIGN KEY(外键约束的字段名称) REFERENCES数据表名称(字段名称) ON DELETE CASCADE;
【例3.8】若要在tb_emp5表上添加外键约束,可执行如下的SQL语句:
ALTER TABLE tb_emp5 ADD CONSTRAINTS fk_emp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id) ON DELETE CASCADE;
上述语句执行完成后,即为tb_emp5表的deptId字段添加了外键约束。
对于不需要的外键约束,可以将其移除,具体的语法格式如下:
ALTER TABLE数据表名称 DROP CONSTRAINTS约束名称
【例3.9】若要移除数据表tb_emp5的外键约束fk_emp_dept1,可执行如下的SQL语句:
ALTER TABLE tb_emp5 DROP CONSTRAINTS fk_emp_dept1;
上述语句执行完成后,即可成功移除tb_emp5的外键约束。
非空约束(Not Null Constraint)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。
非空约束的语法规则如下:
字段名 数据类型not null
【例3.10】若要定义数据表tb_emp6,指定员工的名称不能为空,可执行如下的SQL语句:
上述语句执行完成后,在tb_emp6中创建了一个name字段,其插入值不能为空(NOT NULL)。
在创建数据表时如果没有添加非空约束,可以在修改表时为数据表添加非空约束。添加非空约束的语法格式如下:
ALTER TABLE数据表名称 MODIFY字段名称NOT NULL;
【例3.11】若要将tb_emp5表上的字段name指定为不能为空,可执行如下的SQL语句:
ALTER TABLE tb_emp5 MODIFY name NOT NULL;
上述语句执行完成后,即为tb_emp5表的name字段添加了非空约束。
对于不需要的非空约束,可以将其移除,具体的语法格式如下:
ALTER TABLE数据表名称 MODIFY字段名称NULL;
【例3.12】若要移除数据表tb_emp5的非空约束,可执行如下的SQL语句:
ALTER TABLE tb_emp5 MODIFY name NULL;
上述语句执行完成后,即成功移除了非空约束。
唯一性约束(Unique Constraint)要求该列唯一,允许为空,但只能出现一个空值。唯一性约束可以确保一列或者几列不出现重复值。
非空约束的语法规则如下:
(1)在定义好列之后直接指定唯一性约束,可采用如下的语法规则:
字段名 数据类型UNIQUE
【例3.13】若要定义数据表tb_dept2,指定部门的名称唯一,可执行如下的SQL语句:
(2)在定义好所有列之后指定唯一性约束,可采用如下的语法规则:
[CONSTRAINT <约束名>] UNIQUE(<字段名>)
【例3.14】若要定义数据表tb_dept3,指定部门的名称唯一,可执行如下的SQL语句:
UNIQUE和PRIMARY KEY的区别:一个数据表中可以有多个字段声明为UNIQUE,但只能有一个PRIMARY KEY声明;声明为PRIMAY KEY的列不允许有空值,但是声明为UNIQUE的字段允许空值存在。
修改数据表时也可以添加唯一性约束,具体的SQL语法格式如下:
ALTER TABLE数据表名称 ADD CONSTRAINT约束名称UNIQUE(字段名称);
【例3.15】若要为tb_emp5表上的字段name添加唯一性约束,可执行如下的SQL语句:
ALTER TABLE tb_emp5 ADD CONSTRAINT unq_name UNIQUE(name);
上述语句执行完成后,即为tb_emp5表的name字段添加了唯一性约束。
对于不需要的唯一性约束,可以将其移除,具体的语法格式如下:
ALTER TABLE数据表名称 DROP CONSTRAINTS约束名称;
【例3.16】若要移除数据表tb_emp5的唯一性约束,可执行如下的SQL语句:
ALTER TABLE tb_emp5 DROP CONSTRAINTS unq_name;
上述语句执行完成后,即可成功移除唯一性约束。
默认约束(Default Constraint)指定某列的默认值。例如男性同学较多,性别就可以默认为'男'。如果插入一条新的记录时没有为这个字段赋值,那么系统会自动为这个字段赋值为'男'。
默认约束的语法规则如下:
字段名 数据类型DEFAULT默认值
【例3.17】若要定义数据表tb_emp7,指定员工的部门编号默认为1111,可执行如下的SQL语句:
以上语句执行成功之后,表tb_emp7上的字段deptId拥有了一个默认的值1111,新插入的记录如果没有指定部门编号,就都默认为1111。
检查约束为CHECK约束,规定每一列能够输入的值,从而可以确保数值的正确性。例如性别字段中可以规定只能输入“男”或“女”,此时可以用到检查约束。
检查约束的语法规则如下:
CONSTRAINT检查约束名称CHECK(检查条件)
【例3.18】若要定义数据表tb_emp8,指定员工的性别只能输入“男”或者“女”,可执行如下的SQL语句:
以上语句执行成功之后,表tb_emp8上的字段gender添加了检查约束,新插入记录时只能输入“男”或者“女”。
修改数据表时也可以添加检查约束,具体SQL语法格式如下:
ALTER TABLE数据表名称 ADD CONSTRAINT约束名称CHECK( 检查条件);
【例3.19】若要为数据表tb_emp8上的字段age添加检查约束,规定年龄输入值为15~25,可执行如下的SQL语句:
ALTER TABLE tb_emp8 ADD CONSTRAINT chk_age CHECK(age>=15 and age<=25);
上述语句执行完成后,即为tb_emp8表的age字段添加了检查约束。
对于不需要的检查约束,可以将其移除,具体的语法格式如下:
ALTER TABLE数据表名称 DROP CONSTRAINTS约束名称;
【例3.20】若要移除数据表tb_emp5的检查约束chk_age,可执行如下的SQL语句:
ALTER TABLE tb_emp8 DROP CONSTRAINTS chk_age;
上述语句执行完成后,即成功移除了检查约束chk_age。
在数据库应用中,经常希望在每次插入新记录时系统自动生成字段的主键值。可以通过为表主键添加GENERATED BY DEFAULT AS IDENTITY关键字来实现。默认情况下,在Oracle中自增值的初始值是1,每新增一条记录,字段值自动加1。一个数据表只能有一个字段使用自增约束,且该字段必须为主键的一部分。
设置自增约束的语法规则如下:
字段名 数据类型GENERATED BY DEFAULT AS IDENTITY
【例3.21】若要定义数据表tb_emp9,指定员工的编号自动递增,可执行如下的SQL语句:
上述例子执行后,会创建名为tb_emp9的数据表。该表中的id字段的值在添加记录的时候会自动增加,在插入记录的时候,默认的自增字段id的值从1开始,每次添加一条新记录,该值自动加1。
例如,执行如下插入语句:
SQL> INSERT INTO tb_emp9 (name) VALUES('张三'); SQL> INSERT INTO tb_emp9 (name) VALUES('程普');
上述语句执行完后,tb_emp9表中增加了两条记录,在这里并没有输入id的值,但系统已经自动添加该值,使用SELECT命令查看记录,如下所示:
提 示
这里使用INSERT语句向数据表中插入记录的方法,只能一次插入一条数据记录(即一行数据)。如果想一次插入多条数据记录,就需要使用insert into … select …子查询的方式。具体使用方法参考本章后面的章节。