《MySQL 5.5从零开始学》(3)之创建数据表

《MySQL 5.5从零开始学》(3)之创建数据表

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

本部分内容参考自《MySQL 5.5从零开始学》。

在创建完数据库之后,接下来的工作就是创建数据表。所谓创建数据表,指的是在已经创建好的数据库中建立新表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性(包括实体完整性、引用完整性和域完整性等)约束的过程。本节将介绍创建数据表的语法形式、如何添加主键约束、外键约束、非空约束等。

创建表的语法格式

数据表属于数据库,在创建数据表之前,应该使用语句 USE <数据库名>指定操作是在哪个数据库中进行,如果没有选择数据库,会抛出No database selected 的错误。
创建数据表的语句为 CREATE TABLE,语法规则如下:

CREATE TABLE <表名>
(
字段名 1 数据类型 [列级别约束条件] [默认值],
字段名2 数据类型 [列级别约束条件] [默认值],
...
[表级别约束条件]
)

使用 CREATE TABLE 创建表时,必须指定以下信息:

  1. 要创建的表的名称,不区分大小写,不能使用 SQL 语言中的关键字,如 DROPALTERINSERT 等。
  2. 数据表中每一个列(字段)的名称和数据类型,如果创建多个列,要用逗号隔开。

例 1:创建员工表 tb_emp1,结构如下表所示。

字段名称数据类型备注
idINT(11)员工编号
nameVARCHAR(25)员工名称
deptIdINT(11)所在部门编号
salaryFLOAT工资

首先选择创建表的数据库,SQL 语句如下:

use test_db;

创建 tb_emp1 表,SQL 语句为:

CREATE TABLE tb_emp1(
    id INT(11),
    name VARCHAR(25),
    deptId INT(11),
    salary FLOAT
);

语句执行后,便创建了一个名称为 tb_emp1 的数据表,使用 SHOW TABLES; 语句查看数据表是否创建成功,SQL 语句如下:

image.png

可以看到,test_db 数据库中已经有了数据表 tb_tmp1,数据表创建成功。

使用主键约束

主键,又称主码,是表中一列或多列的组合。主键约束(Primary Key Constraint)要求主键列的数据唯一,并且不允许为空。主键能够唯一地标识表中的一条记录,可以结合外键来定义不同数据表之间的关系,并且可以加快数据库查询的速度。主键和记录之间的关系如同身份证和人之间的关系,它们之间是一对应的。主键分为两种类型:单字段主键和多字段联合主键。

单字段主键

主键由一个字段组成,SQL 语句格式分为以下两种情况。
1、在定义列的同时指定主键,语法规则如下:

字段名 数据类型 PRIMARY KEY [默认值]

例 2:定义数据表 tb_emp2,其主键为 id, SQL 语句如下:

CREATE TABLE tb_emp2(
    id INT(11) PRIMARY KEY,
    name VARCHAR(25),
    deptId INT(11),
    salary FLOAT
);

2、在定义完所有列之后指定主键。

[CONSTRAINT <约束名>] PRIMARY KEY [字段名]

例 3:定义数据表 tb_emp3,其主键为 id, SQL 语句如下:

CREATE TABLE tb_emp3(
    id INT(11) PRIMARY KEY,
    name VARCHAR(25),
    deptId INT(11),
    salary FLOAT,
    PRIMARY KEY(id)
);

上述两个例子执行后的结果是一-样的,都会在 id 字段上设置主键约束。

多字段联合主键

主键由多个字段联合组成,语法规则如下:

PRIMARY KEY[字段 1, 字段 2, ... , 字段 n]

例 4:定义数据表 tb_emp4,假设表中间没有主键 id,为了唯一确定一个 员工,可以把 namedeptld 联合起来做为主键,SQL 语句如下:

CREATE TABLE tb_emp4
(
    name VARCHAR(25),
    deptId INT(11),
    salary FLOAT,
    PRIMARY KEY(name, deptId)
)

语句执行后,便创建了一个名称为 tb__emp4 的数据表,name 字段和 deptld 字段组合在一起成为 tb_emp4 的多字段联合主键。

使用外键约束

外键用来在两个表的数据之间建立链接,它可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
外键:首先它是表中的一个字段,它可以不是本表的主键,但对应另外一个表的主键。外键主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联关系的行。外键的作用是保持数据的一致性、完整性。例如,部门表 tb_dept 的主键是 id,在员工表 tb_ emp5 中有一个键 deptld 与这个 id 关联。
主表(父表):对于两个具有关联关系的表而言,相关联字段中主键所在的那个表即是主表。
从表(子表):对于两个具有关联关系的表而言,相关联字段中外键所在的那个表即是从表。
创建外键的语法规则如下:

[CONSTRAINT <外键名>] FOREIGN KEY 字段名 1 [, 字段名 2, ...]
    REFERENCES <主表名> 主键列 1 [, 主键列 2, ...]

“外键名”为定义的外键约束的名称,一个表中不能有相同名称的外键;“字段名" 表示子表需要添加外键约束的字段列:“主表名”即被子表外键所依赖的表的名称:“主键列”表示主表中定义的主键列,或者列组合。

例 5:定义数据表 tb_emp5,并在 tb_ emp5 表上创建外键约束。
创建一个部门表 tb_ dept1, 表结构如下表所示:

字段名称数据类型备注
idINT(11)部门编号
nameVARCHAR(22)部门名称
locationVARCHAR(50)部门位置

SQL 语句如下:

CREATE TABLE tb_dept1
(
    id INT(11) PRIMARY KEY,
    name VARCHAR(22) NOT NULL,
    location VARCHAR(50)
)

定义数据表 tb_emp5, 让它的键 deptld 作为外键关联到 tb_dept1 的主键 id, SQL 语句为:

CREATE TABLE tb_emp5
(
    id INT(11) PRIMARY KEY,
    name VARCHAR(25),
    deptId INT(11),
    salary FLOAT,
    CONSTRAINT fk_tmp_dept1 FOREIGN KEY(deptId) REFERENCES tb_dept1(id)
)

以上语句执行成功之后,在表 tb_emp5 上添加了名称为 fk_emp_dept1 的外键约束,外键名称为 deptld,其依赖于表 tb_dept1 的主键 id

关联指的是在关系型数据库中,相关表之间的联系。它是通过相容或相同的属性或属性组来表示的。子表的外键必须关联父表的主键,且关联字段的数据类型必须匹配,如果类型不一样,则创建子表时,就会出现错误 ERROR 1005 (HY000): Can't create table 'database.tablename'(errmo: 150)

使用非空约束

非空约束(Not Null Constraint)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统会报错。
非空约束的语法规则如下:

字段名 数据类型 not null

例 6:定义数据表 tb_emp6,指定员工的名称不能为空,SQL 语句如下:

CREATE TABLE tb_tmp6
(
    id INT(11) PRIMARY KEY,
    name VARCHAR(25) NOT NULL,
    deptId INT(11),
    salary FLOAT,
    CONSTRAINT fk_tmp_dept2 FOREIGN KEY(deptId) REFERENCES tb_dept(id)
)

执行后,在 tb_emp6 中创建了一个 Name 字段,其插入值不能为空(NOT NULL)。

使用唯一性约束

唯一性约束(Unique Constraint)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。
非空约束的语法规则如下:
1、在定义完列之后直接指定唯一-约束, 语法规则如下:

字段名 数据类型 UNIQUE

例 7:定义数据表 tb_dept2,指定部门的名称唯一,SQL 语句如下:

CREATE TABLE tb_dept2
(
    id INT(11) PRIMARY KEY,
    name VARCHAR(22),
    location VARCHAR(50),
    CONSTRAINT STH UNIQUE(name)
)

2、在定义完所有列之后指定唯一约束,语法规则如下:

[CONSTRAINT <约束名>] UNIQUE(<字段名>)

例 8:定义数据表 tb_dept3, 指定部门的名称唯一,SQL 语句如下:

CREATE TABLE tb_dept3
(
    id INT(11) PRIMARY KEY,
    name VARCHAR(22),
    location VARCHAR(50),
    CONSTRAINT STH UNIQUE(name)
)

UNIQUEPRIMARY KEY 的区别:一个表中可以有多个字段声明为 UNIQUE,但只能有一个 PRIMARY KEY 声明;声明为 PRIMAY KEY 的列不允许有空值,但是声明为 UNIQUE 的字段允许空值(NULL)的存在。

使用默认约束

默认约束(Default Constraint)指定某列的默认值。如男性同学较多,性别就可以默认为‘男’。如果插入一条新的记录时没有为这个字段赋值,那么系统会自动为这个字段赋值为‘男’ 。
默认约束的语法规则如下:

字段名 数据类型 DEFAULT 默认值

例 9:定义数据表 tb_emp7,指定员工的部门编号默认为 1111, SQL 语句如下:

CREATE TABLE tb_emp7
(
    id INT(11) PRIMARY KEY,
    name VARCHAR(25) NOT NULL,
    deptId INT(11) DEFAULT 1111,
    salary FLOAT,
    CONSTRAINT fk_emp_dept3 FOREIGN KEY(deptId) REFERENCES tb_dept(id)
)

以上语句执行成功之后,表 tb_emp7,上的字段 deptId 拥有了一个默认的值 1111,新插入的记录如果没有指定部门编号,则默认都为 1111

设置表的属性值自动增加

在数据库应用中,经常希望在每次插入新记录时,系统自动生成字段的主键值。可以通过为表主键添加 AUTO_INCREMENT 关键字来实现。默认的,在 MySQL 中 AUTO_INCREMENT 的初始值是 1,每新增一条记录,字段值自动加 1。一个表只能有一个字段使用 AUTO_INCREMENT 约束,且该字段必须为主键的一部分。AUTO_INCREMENT 约束的字段可以是任何整数类型(TINYINTSMALLININTBIGINT 等)。
设置唯一性约束的语法规则如下:

字段名 数据类型 AUTO_INCREMENT

例 10:定义数据表 tb_tmp8,指定员工的编号自动递增,SQL 语句如下:

CREATE TABLE tb_emp8
(
    id INT(11) PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(25) NOT NULL,
    deptId INT(11),
    salary FLOAT,
    CONSTRAINT fk_emp_dept5 FOREIGN KEY(deptId) REFERENCES tb_dept3(id)
)

上述例子执行后,会创建名称为 tb_emp8 的数据表。表 tb_emp8 中的 id 字段的值在添加记录的时候会自动增加,在插入记录的时候,默认的自增字段id的值从1开始,每次添加一条新记录,该值自动加 1
例如,执行如下插入语句:

mysql> INSERT  INTO tb_emp8(name,salary) VALUES('Lucy',100),('Lura',1200),('Kevin',1500);

语句执行完后,tb_emp8 表中增加 3 条记录,在这里并没有输入 id 的值,但系统已经自动添加该值,使用 SELECT 命令查看记录,如下所示。

image.png

这里使用 INSERT 声明向表中插入记录的方法,并不是 SQL 的标准语法,这种语法不一定被其他的数据库支持,只能在 MySQL 中使用。

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/mysql55-3.html

Buy me a cup of coffee ☕.