文章教程

15.1创建数据表

9/17/2020 9:40:31 PM 人评论 次浏览

15.1 创建数据表

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

15.1.1 创建数据表的语法形式

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

创建数据表的语句为CREATE TABLE,语法规则如下:

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

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

(1)要创建的表的名称,不区分大小写,不能使用SQL语言中的关键字,如DROP、ALTER、INSERT等。

(2)数据表中每一个列(字段)的名称和数据类型,如果创建多个列,要用逗号隔开。

【例15.1】创建员工表tb_emp1,结构如表15-1所示。

表15-1 tb_emp1表结构

字段名称 数据类型 备注
id INT(11) 员工编号
name VARCHAR(25) 员工名称
deptId INT(11) 所在部门编号
salary FLOAT 工资

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

  USE test;

创建tb_emp1表,SQL语句为:

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

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

  mysql> SHOW TABLES;
  +-----------------------+
  | Tables_in_ test    |
  +----------------------+
  | tb_emp1         |
  +----------------------+
  1 row in set (0.00 sec)

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

15.1.2 使用主键约束

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

1.单字段主键

主键由一个字段组成,SQL语句格式分以下两种情况。

(1)在定义列的同时指定主键,语法规则如下:

  字段名 数据类型 PRIMARY KEY

【例15.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 [字段名]

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

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

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

2.多字段联合主键

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

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

【例15.4】定义数据表tb_emp4,假设表中间没有主键id,为了唯一确定一个员工,可以把name、deptId联合起来作为主键,SQL语句如下:

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

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

15.1.3 使用外键约束

外键用来在两个表的数据之间建立连接,它可以是一列或者多列。一个表可以有一个或多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每一个外键值必须等于另一个表中主键的某个值。

外键是表中的一个字段,它可以不是本表的主键,但对应另外一个表的主键。外键的主要作用是保证数据引用的完整性,定义外键后,不允许删除在另一个表中具有关联关系的行。例如,部门表tb_dept的主键是id,在员工表tb_emp5中有一个键deptId与这个id关联。

对于两个具有关联关系的表而言,相关联字段中主键所在的那个表称为主表(父表)。

对于两个具有关联关系的表而言,相关联字段中外键所在的那个表称为从表(子表)。

创建外键的语法规则如下:

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

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

【例15.5】定义数据表tb_emp5,并在tb_emp5表上创建外键约束。

创建一个部门表tb_dept1,表结构如表15-2所示。

表15-2 tb_dept1表结构

字段名称 数据类型 备注
id INT(11) 部门编号
name VARCHAR(22) 部门名称
location VARCHAR(50) 部门位置

SQL语句如下:

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

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

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

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

提 示

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

15.1.4 使用非空约束

非空约束(NOT NULL constraint)指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时,没有指定值,数据库系统会报错。

非空约束的语法规则如下:

  字段名 数据类型 NOT NULL

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

  CREATE TABLE tb_emp6
  (
        id     INT(11) PRIMARY KEY,
        name   VARCHAR(25) NOT NULL,
        deptId  INT(11),
        salary  FLOAT,
        CONSTRAINT fk_emp_dept2  FOREIGN KEY (deptId) REFERENCES tb_dept1(id)
  );

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

15.1.5 使用唯一性约束

唯一性约束(UNIQUE constraint)要求添加该约束的列字段的值唯一,允许为空,但只能出现一个空值。唯一性约束可以确保一列或者几列不出现重复值。

添加唯一性约束的语法规则如下。

(1)在定义完列之后直接指定唯一约束,语法规则如下:

  字段名 数据类型 UNIQUE

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

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

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

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

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

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

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

15.1.6 使用默认约束

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

默认约束的语法规则如下:

  字段名 数据类型 DEFAULT 默认值

【例15.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_dept1(id)
  );

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

15.1.7 设置表的属性值自动增加

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

设置字段值自增属性的语法规则如下:

  字段名 数据类型 AUTO_INCREMENT

【例15.10】定义数据表tb_emp8,指定员工的编号自动递增,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_dept1(id)
  );

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

例如,执行如下插入语句:

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

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

mysql> SELECT * FROM tb_emp8;

+---- +------- +-------- +--------+
id name deptId salary
+---- +------- +-------- +--------+
1 Lucy NULL 1000
2 Lura NULL 1200
3 Kevin NULL 1500
+---- +------- +-------- +--------+

3 rows in set (0.00 sec)

提 示

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

教程类别