数据表的基础知识

表的定义

  • 表是包含数据库中所有数据的数据库对象。

  • 在表中,数据成二维行列格式,每一行代表一个唯一的记录,每一列代表一个域。

列名

列名是用来访问表中具体域的标识符,列名必须遵循下列规则:

  • 列名是可以含有从1到128的asc码字符,它的组成包括字母、下划线、符号以及数字

  • 不要给列名命名为与sql关键字相同的名字,比如 select, in, desc等。

  • 列名应该反映数据的属性。

数据类型

数值类型

  • 整数数据类型

    • 整数数据类型包括 bigintintmediumintsmallinttinyint

    数据类型

    取值范围

    说明

    bigint

    -2^63 - 2^63-1

    一位为 8 个字节

    int

    -2^31 - 2^31 - 1

    一位大小为 4 个字节

    mediumint

    -2^23 - 2^23 - 1

    一位大小为 2 个字节

    smallint

    -2^15 - 2^15 - 1

    一位大小为 2 个字节

    tinyint

    -2^7 - 2^7- 1

    一位大小为 1 个字节

  • 小数数据类型

    • 小数数据类型包括 decimalnumeric两类。从功能上说两者完全等价,两者的唯一区别在于 decimal不能用于带有 indentity 关键字的列

    • 声明小数型数据的格式是 numeric | decimal(p[,s]),其中p 为精度,s为小数位数,s的默认值为0

  • 浮点数据类型

  • 浮点型也称近似类型。这种类型不能提供精确表示数据的精度,使用这种类型来存储某些数值时,有可能会损失些精度。

数据类型

取值范围

说明

float

占用4个字节长度

储存要求8个字节,数据精度为7位小数

double

占用8个字节长度

储存要求8个字节,数据精度为15位小数

字符串类型

常用的字符串类型主要包括charvarcharbinaryvarbinary 等类型。

类型名称

说明

存储需求

CHAR(M)

固定长度非二进制字符串

M 字节,1<=M<=255

VARCHAR(M)

变长非二进制字符串

L+1字节,在此,L< = M和 1<=M<=255

TINYTEXT

非常小的非二进制字符串

L+1字节,在此,L<2^8

TEXT

小的非二进制字符串

L+2字节,在此,L<2^16

MEDIUMTEXT

中等大小的非二进制字符串

L+3字节,在此,L<2^24

LONGTEXT

大的非二进制字符串

L+4字节,在此,L<2^32

ENUM

枚举类型,只能有一个枚举字符串值

1或2个字节,取决于枚举值的数目 (最大值为65535)

SET

一个设置,字符串对象可以有零个或 多个SET成员

1、2、3、4或8个字节,取决于集合 成员的数量(最多64个成员)

日期时间类型

在 mysql中,日期时间类型包括 datetimetimetimestampdate等。

数据类型

占用字节

最小值

最大值

零值表示

date

4

1000-01-01

9999-12-31

0000-00-00

datetime

8

1000-01-01 00:00:00

9999-12-31 23:59:59

0000-00-00 00:00: 00

timestamp

4

19700101080001

2038年的某个时刻

0000000000000000

time

3

-838:59:59

838:59:59

00:00:00

year

1

1901

2155

0000

举个栗子:管理网上书城系统数据库

创建数据表

语法格式

CREATE TABLE <表名> ( [表定义选项] )[表选项][分区选项];

知识点

  • 表名:两种写法,可以直接写数据表的名字 tbl_name ,也可以 db_name.tbl_name ,先指定数据库再指定数据表名;后者写法是为了:无论是否在当前数据库,也能通过这种方式在指定数据库下创建表

  • 表定义选项:一般都是 列名、列定义、默认值、约束、索引组成

创建如下数据表-客户信息表customers

序号

属性名称

含义

数据类型

为空性

备注

1

cid

客户编号

char(6)

not null

主键约束

2

ctruename

真实姓名

varchar(30)

not null

3

cpassword

客户密码

varchar(30)

not null

4

csex

性别

char(2)

not null

默认男

5

caddress

客户地址

varchar(50)

null

6

cmobile

手机号码

varchar(11)

not null

7

cemail

电子邮箱

varchar(50)

null

8

cregisterdate

用户注册日期

datetime

not null

默认当前日期

实际代码

-- 如果存在就删除, 防止重复建表而报错
drop table if exists customers; 
create table customers(
    cid char(6) not null primary key,
    ctruename varchar (30) not null,
    cpassword varchar (30) not null,
    csex char(2)not null default '男',
    caddress varchar (50) null,
    cmobile varchar (11) not null unique,
    cemail varchar(50) null,
    cregisterdate datetime not null
);

附:Django中使用ORM操作数据库

from django.db import models

class Customer(models.Model):
    cid = models.CharField(max_length=6, primary_key=True)
    ctruename = models.CharField(max_length=30)
    cpassword = models.CharField(max_length=30)
    csex = models.CharField(max_length=2, default='男')
    caddress = models.CharField(max_length=50, null=True)
    cmobile = models.CharField(max_length=11, unique=True)
    cemail = models.EmailField(max_length=50, null=True)
    cregisterdate = models.DateTimeField()

    class Meta:
        db_table = 'customers'

约束

在 mysql中可以通过 primary key约束、foreign key约束、 unique、空值约束和默认值约束等来实施数据完整性

主健约束

主键(primary key)约束是使用最为频繁的约束 它的作用是唯一标记一条数据

  1. 主键不能为null

  2. 主键不能重复

  3. 用过的主键, 即便删除来这条记录, 最好也不要再用

  4. 主键不能修改

单字段主键

『示例』顾客信息表 customers中需要以“顾客编号”作为顾客的唯一标识,在创建数据表 customers时,为cid列设置primary key约束,由于单列组成主键,故该主键可以定义为列级主键。

多字段主键

『示例』如果在订单详情表中不设置编号,则可以将表中“订单编号 + 商品编号”作为订单详情的唯一标识,在创建数据表 orderdetails时, 为oid和gid的组合设置 primary key约束。

创建如下数据表-订单详情表orderdetails

序号

属性名称

含义

数据类型

为空性

备注

1

oid

订单编号

char(14)

not null

主键约束

2

gid

商品编号

char(6)

not null

主键约束

3

odprice

购买价格

double

not null

4

odnumber

购买数量

int

not null

实际代码

create table orderdetails(
    oid char(14) not null,
    gid char(6) not null,
    odprice float not null,
    odnumber int not null,
    primary key (oid, gid)
);

附:Django中使用ORM操作数据库

from django.db import models

class OrderDetails(models.Model):
    oid = models.CharField(max_length=14)
    gid = models.CharField(max_length=6)
    odprice = models.FloatField()
    odnumber = models.IntegerField()

    class Meta:
        db_table = 'orderdetails'
        unique_together = (('oid', 'gid'),)

外健约束

外键( foreign key )约束标识表之间的关系,用于强制参照完整性,为表中一列或者多列数据提供参照完整性。

简单说, 外键是连接另一个表的锚点

创建外键的基本语法如下:

[constraint<外键名>] foreign key 列名1 [, 列名2, ...] references <主键表> 主键列1 [主键列2...]

看着挺唬人, 其实很简单, 看个例子

『示例』在创建数据表订单表 orders时,表中的cid(客户编号)引用了客户表 customers中的客户编号,需要建立 orders表和 customers 表之间的关系。其中cid为关联列, customers 表为主键表, orders表为外键表。

创建如下数据表-订单信息表orders

序号

属性名称

含义

数据类型

为空性

备注

1

oid

订单编号

char(14)

not null

主键约束

2

cid

客户编号

char(6)

not null

外键约束

3

odate

订单日期

datetime

not null

当前日期

4

osum

订单名额

double

not null

5

ostatus

订单状态

char(1)

not null

实际代码

-- 如果存在就删除, 防止重复建表而报错
drop table if exists orders; 
create table orders(
    oid char(14) not null primary key,
    cid char(6) not null,
    odate datetime not null,
    osum float not null,
    ostatus char(1) not null,
    foreign key(cid) references customers(cid) on delete cascade on update cascade
)engine=innodb;

附:Django中使用ORM操作数据库

from django.db import models
from customers.models import Customer

class Orders(models.Model):
    oid = models.CharField(max_length=14, primary_key=True)
    cid = models.ForeignKey(Customer, on_delete=models.CASCADE)
    odate = models.DateTimeField()
    osum = models.FloatField()
    ostatus = models.CharField(max_length=1)

    class Meta:
        db_table = 'orders'

补充:

on update cascadeon delete cascade 的区别

这是数据库外键定义的一个可选项,用来设置当主键表中的被参考列的数据发生变化时,外键表中响应字段的变换规则的。

update 则是主键表中被参考字段的值更新,delete是指在主键表中删除一条记录:
on update 和 on delete 后面可以跟的词语有四个

no action , set null , set default ,cascade

  • no action 表示 不做任何操作,

  • set null 表示在外键表中将相应字段设置为null

  • set default 表示设置为默认值

  • cascade 表示级联操作,就是说,如果主键表中被参考字段更新,外键表中也更新,主键表中的记录被删除,外键表中改行也相应删除。

级联更新时,依据的是之前匹配的数据,在主表更新关联的外键字段的值后,系统自动更新从表的相应外键字段的值,而不是其他未设置为主外键关联的字段,不是主外键关联的字段不受影响。

唯一约束

『示例』为了保证客户信息表表 customers中的手机号不重复,在创建数据表 customers时,为 cmobile设置 unique约 束

-- 如果存在就删除, 防止重复建表而报错
drop table if exists customers; 

create table customers(
    cid char(6) not null primary key,
    ctruename varchar (30) not null,
    cpassword varchar (30) not null,
    csex char(2)not null,
    caddress varchar (50) null,
    cmobile varchar (11) not null unique,
    cemail varchar(50) null,
    cregisterdate datetime not null
);

默认值约束

『示例』在创建客户信息表 customers时,为用户性别csex 字段设置为默认值“男”。

create table customers(
    cid char(6) not null primary key,
    ctruename varchar (30) not null,
    cpassword varchar (30) not null,
    csex char(2)not null default '男',
    caddress varchar (50) null,
    cmobile varchar (11) not null unique,
    cemail varchar(50) null,
    cregisterdate datetime not null
);

非空约束

  • 非空值约束限制一列或多个列的值不能为空(null) 空表示未定义或未知的值。

  • 在默认情况下,所有列都接受空值, 若要某列不接受空值, 则可以在该列上设置not null约束。

  • null值既不等价于数值型数据0, 也不等价于字符型数据中的空串, 只是表明字段值是未知的

  • not null 约束不可以出现在表级定义中,not null约束只能在列级上定义。

  • 一般情况下,我们使用列级定义即可。但是如果遇到定义复合主键(两列一起被定义为主键)时,需要用到表级定义。

数据练习举例来源于:猫哥的技术博客

查看表结构

desc shisuiyi.customers;

查看数据表的创建语句

show create table customers;

该命令不仅可以查看创建表时的详细语句,而且可以查看存储引擎和字符编码

复制数据表

-- 仅复制表结构
create table customers2 like customers;

-- 复制表结构和数据
create table customers3 as select  * from customers;

-- 仅复制表的指定字段结构
create table customers4 as select cid,ctruename,cpassword from customers where 1<>1;

-- 复制表的指定字段结构和数据
create table customers5 as select id,uname,sex from customers;

-- 查看表创建语句:没有包含主键和自增
show create table customers5;

知识点

  • 仅复制全部字段的结构直接加 like

  • 复制表不包含主键、索引、自增等