mysql建表的字段类型和约束条件

一 . 常见字段类型分类 

常见字段类型
类型分类描述
数值型整型
小数

①定点数

②浮点数

字符型较短的文本

①char

②varchar

较长的文本

①text

②blob(二进制数据)

日期时间型

1.1数值型 

1.1.1 整型

特点:

  1. 整数类型默认是有符号,如果想设置成无符号,需要在整数类型后添加 UNSIGNED
  2. 如果插入的数值超出了整型的范围,会报错(out of range),并且插入的值是临界值(具体的看数据库的版本)
  3. 如果不设置长度,会有默认的长度
整型
整数类型字节有符号和无符号的表示范围
Tinyint1

有符号 Tinyint                       

-128~127
无符号 Tinyint UNSIGNED   0~255
Smallint2

有符号 Smallint                       

-32768 ~ 32767
无符号  Smallint UNSIGNED   0~65535
Mediumint3

有符号 Mediumint                   

-8388608 ~ 8388607
无符号 Mediumint UNSIGNED 0 ~ 1677215

Int

integer

4有符号 Int

-2147483648 ~ 2147483647
无符号 Int  UNSIGNED0~ 4294967295
Bigint8

有符号 Bigint

-9223372036854775808~9223372036854775807
无符号 Bigint  UNSIGNED0 ~ 2**64-1

1.1.1.1 设置整型字段的无符号和有符号 

语法:整数类型 unsigned   如:INT UNSIGNED

1.1.1.2字段类型长度的含义

描述:建表的时候,在设置字段类型时,一般会设置字段的长度。这里指的长度并不是指该字段的数值的表示范围,字段的表示范围是由字段的类型决定的,这里的长度,实际上指的是数据的显示宽度,即宽度不够时会在数值左边添加0来填充。

如: 字段类型 (长度)  ZEROFILL

注:ZEROFILL 自动将数值转换为无符号的整数

如下:

1.1.2小数 

特点:

  1. M 表示  : 整数部分 + 小数部分
  2. D 表示 : 小数部位
  3. 当超过范围(当整数部分长度  > M-D  ),具体的报错警告得看具体的版本  mysql8版本 即 当整数部分长度  > M-D   就会报错
  4. M和D都可以省略。decimal省略M和D,则M默认为10,D默认为0,即只会保留整数部分;float和double则按范围来决定精度
  5. 定点型的精度较高,如果要求插入的数值精度较高则使用定点型,如货币运算

1.1.2.1 浮点数类型

浮点数类型
浮点数类型字节范围
float(M,D)4±1.75494321E-38 ~ ±3.402823466E+38
double(M,D)8±2.2250738585072014E-308 ~ ±1.7976931348623157E+308

1.1.2.2 定点数类型(精度更高)

特点:

定点数类型
定点数类型字节范围

DEC(M,D)

decimal(M,D)

M+2最大取值范围与double相同,给定的小数的有效取值范围由M和D决定

1.2字符型 

1.2.1 较短的文本

较短文本
字符类型最多字符数描述特点空间利用率时间效率
char(M)

M可以省略,默认为1

M为 0~255之间的整数固定长度的字符比较消耗空间,空间利用率低
varchar(M)

M

M不可以省略

M为0~65535之间的整数可变长度的字符比较节省空间,空间利用率高

1.2.1.1 char

1.2.1.2 varchar

1.2.2 较长的文本

1.2.2.1 text

1.2.2.2 blob

1.2.3 其他字符串

其他字符串
字符类型分类描述
二进制字符串

binary

保存较短的二进制字符串

类似于char和varchar,不同的是binary,varbinary只包含二进制字符串,不包含非二进制的字符串

varbinary

保存较长的二进制字符串

enum类型具体用法例一

又称枚举类型

要求插入的值必须属于列表中指定值之一

如:列表成员为1~255,则只需要1字节存储

set类型具体用法例二

和enum类型类型类似,它可以保存0~64个成员

和enum类型的最大区别是set类型一次可以选择多个成员,而enum类型只能选择一个

根据成员个数的不同,存储占用的字节也不相同

例一:

例二:

1.3 日期时间型 

日期时间型数据
日期时间类型字节最小值最大值
date41000-01-019999-12-31
datatime81000-01-01 00:00:009999-12-31 23:59:59
timestamp4197001010800012038年的某个时刻
time3-838:59:59838:59:59
year119012155

datetime和timestamp的区别

  1. Timestamp支持的时间范围较小,取值范围:19700101080001 到 2038 年的某个时间 ;Datetime的取值范围: 1000-1-1 到 9999- 12-31

  2. timestamp和实际时区有关,更能反映实际的日期,而datetime则只能反映出插入时的当地时区  如:例一

  3. timestamp的属性受Mysq|版本和SQLMode的影响很大

例一:

 

二 .约束类型

描述:在创建表结构时的一种约束条件,用于限制表中的数据,目的时为了保证插入数据的可靠性和准确性 

分类(六大约束):

  1. NOT NULL:非空,用于保证该字段的值不能为空
  2. DEFAULT:默认,用于保证该字段有默认值
  3. PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空
  4. UNIQUE:唯一,用于保证该字段的值具有唯一-性,可以为空
  5. CHECK:检查约束[mysql中不支持]
  6. FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值。在从表添加外键约束,用于引用主表中某列的值

添加约束的时机:

  1. 创建表时
  2. 修改表时

约束的添加分类

  1. 列级(字段)约束:六大约束在语法上都支持,但外键约束没有效果
  2. 表级约束:除了非空(NOT NULL),默认(DEFAULT),其他都支持
CREATE TABLE 表名(
字段名 字段类型 列级约束,
字段名 字段类型 列级约束,
...
字段名 字段类型 列级约束,
表级约束
);

主键和唯一的区别: 

主键和唯一的区别
约束类型保证唯一性是否允许为空是否有多个是否允许组合(联合键)
主键 PRIMARY KEY×至多有一个主键字段可以(但不推荐使用)
唯一 UNIQUE可以有多个唯一字段可以(但不推荐使用)

2.1 列级约束

语法:

CREATE TABLE 表名(
字段名 字段类型 列级约束 列级约束 列级约束...,
字段名 字段类型 列级约束 列级约束 列级约束...,
...
字段名 字段类型 列级约束 列级约束 列级约束...,
);

注:

  1. 只支持 非空,默认,唯一,主键
  2. 一个字段可以有多个约束

例一:

CREATE TABLE stuinfo(
id INT PRIMARY KEY, #主键
stuname VARCHAR(20) NOT NULL,#非空
gender CHAR(1) CHECK(gender="男" OR gender="女"),#检查
seat INT UNIQUE,#唯一
age TINYINT DEFAULT 18,#默认
majorid TINYINT REFERENCES major(id) #外键
);


CREATE TABLE major(
id TINYINT PRIMARY KEY,#主键
majorname VARCHAR(20)
);

2.2 表级约束 

语法:

CREATE TABLE 表名(
字段名 字段类型,
字段名 字段类型,
...
字段名 字段类型,


【CONSTRAINT 约束名】 约束类型(字段名),
【CONSTRAINT 约束名】 约束类型(字段名),
...
【CONSTRAINT 约束名】 约束类型(字段名),
【CONSTRAINT 约束名】 FOREIGN KEY(被关联的表名) REFERENCES 被关联的表名(被关联的字段名) #外键
);

例一:

CREATE TABLE stuinfo(
id INT, 
stuname VARCHAR(20) NOT NULL,#非空
gender CHAR(1),
seat INT,
age TINYINT DEFAULT 18, #默认
majorid TINYINT,

CONSTRAINT pk PRIMARY KEY(id),#主键
CONSTRAINT ck CHECK(gender="男" OR gender="女"),#检查
CONSTRAINT uq UNIQUE(seat),#唯一
CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id) #外键
);

2.2.1 联合主键

联合主键:两个及以上的字段共同组成一个主键.

CREATE TABLE stuinfo (
	id INT,
	stuname VARCHAR ( 20 ) NOT NULL,#非空
	gender CHAR ( 1 ),
	seat INT,
	age TINYINT DEFAULT 18,#默认
	majorid TINYINT,
	
	PRIMARY KEY (id,stuname),#联合主键
	CHECK ( gender = "男" OR gender = "女" ),#检查
	UNIQUE ( seat ),#唯一
	FOREIGN KEY ( majorid ) REFERENCES major ( id ) #外键
);

如何判断主键是否重复 

2.2.2 联合唯一键 

CREATE TABLE stuinfo (
	id INT,
	stuname VARCHAR ( 20 ) NOT NULL,#非空
	gender CHAR ( 1 ),
	seat INT,
	age TINYINT DEFAULT 18,#默认
	majorid TINYINT,
	
	PRIMARY KEY (id),#主键
	CHECK ( gender = "男" OR gender = "女" ),#检查
	CONSTRAINT 联合唯一键 UNIQUE (seat,stuname),#联合唯一键
	FOREIGN KEY ( majorid ) REFERENCES major ( id ) #外键
);

 2.2.3 外键

特点:

  1. 要求在从表设置外键关系
  2. 从表外键字段类型要和主表关联字段类型一致或兼容,但从表外键字段名可以和主表关联字段名不同
  3. 主表的关联字段必须时一个key(主键或唯一)
  4. 插入数据时,先插入主表,再插入从表
  5. 删除数据时,先删除从表,再删除主表

2.3 修改表时添加约束类型

语法:

①列级约束

ALTER TABLE 表名 MODIFY COLUMN 字段名 新字段类型 【新约束类型】;

如: ALTER TABLE 表名 MODIFY COLUMN id PRIMARY KEY; #添加主键约束

②表级约束

ALTER TABLE 表名 ADD 【CONSTRAINT 约束名】 约束类型(字段名);

 如:ALTER TABLE 表名 ADD PRIMARY KEY(id);  #添加主键约束

2.3.1 添加非空约束

 ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 NOT NULL;

2.3.2 添加默认约束

 ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 DEFAULT 默认值;

2.3.3 添加主键约束

①列级约束

ALTER TABLE 表名 MODIFY COLUMN 字段名 PRIMARY KEY;

②表级约束

ALTER TABLE 表名 ADD 【CONSTRAINT 约束名】 PRIMARY KEY(字段名);

2.3.4 添加唯一约束

①列级约束

ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 UNIQUE;

②表级约束

ALTER TABLE 表名 ADD 【CONSTRAINT 约束名】  UNIQUE(字段名);

2.3.5 添加外键

ALTER TABLE 表名 ADD 【CONSTRAINT 约束名】  FOREIGN KEY (主表名)  REFERENCES  主表名( 关联字段名 );

2.4 修改表时删除约束类型

2.4.1 删除非空约束

ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型 NULL;

2.4.2 删除默认约束

 ALTER TABLE 表名 MODIFY COLUMN 字段名 字段类型;

2.4.3 删除主键

ALTER TABLE 表名 DROP PRIMARY KEY

2.4.4 删除唯一键

ALTER TABLE 表名 DROP INDEX 唯一键字段名;

2.4.5 删除外键

ALTER TABLE 表名 DROP FOREIGN KEY 外键名

三 .级联删除与级联置空

3.1 级联删除

在删除有外键的表时,一般先删除从表的相关数据,再删除主表的相关数据。

但硬要先删除主表的相关数据,则可以为从表设置级联关系

语法一:

级联删除:在删除主表相关数据的同时,从表相应的数据也会被删除

ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY(主表名) REFERENCES 主表名(外键字段) ON DELETE CASCADE;

3.2 级联置空

级联置空:在删除主表相关数据的同时,从表相应的数据不会被删除

ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY(主表名) REFERENCES 主表名(外键字段) ON DELETE SET NULL;

MySQL中的建表约束主要用于规定数据库表中数据的规则和限制,包括字段的数据类型、值的范围、唯一性等。约束可以提高数据的质量和安全性,并帮助防止错误数据的插入。以下是几种常见的MySQL建表约束: ### 1. NOT NULL 约束 NOT NULL 约束确保指定的列不允许为空值。 ```sql CREATE TABLE Employees ( EmployeeID INT PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50) NOT NULL ); ``` 在这个例子中,`LastName` 列被设置为不允许空值。 ### 2. UNIQUE 约束 UNIQUE 约束确保列或组合列中的所有值都是唯一的,不允许重复。 ```sql CREATE TABLE Students ( ID INT PRIMARY KEY, Name VARCHAR(50) UNIQUE, Course VARCHAR(50) ); ``` 这里 `Name` 列被设置为唯一,意味着每个学生的姓名只能出现一次。 ### 3. PRIMARY KEY 约束 PRIMARY KEY 约束标识了表中的主键,主键用于唯一识别每行记录。它结合了 UNQURE 和 NOT NULL 的特性。 ```sql CREATE TABLE Customers ( CustomerID INT AUTO_INCREMENT PRIMARY KEY, FirstName VARCHAR(50), LastName VARCHAR(50) ); ``` 在这里,`CustomerID` 自动递增并作为主键,确保其唯一性和非空。 ### 4. FOREIGN KEY 约束 FOREIGN KEY 约束用于建立两个表之间的关联。它确保外键列的值要么引用主键列,要么就是空值。 ```sql CREATE TABLE Orders ( OrderID INT AUTO_INCREMENT PRIMARY KEY, ProductID INT, CustomerID INT, FOREIGN KEY (ProductID) REFERENCES Products(ProductID), FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID) ); ``` 这个例子中,`Orders` 表中的 `ProductID` 和 `CustomerID` 都是外键,分别引用了 `Products` 和 `Customers` 表的主键。 ### 5. CHECK 约束 CHECK 约束允许你设定更复杂的条件,例如数值的范围或者特定的文本格式。 ```sql CREATE TABLE Sales ( SaleID INT AUTO_INCREMENT PRIMARY KEY, Amount DECIMAL(10, 2) CHECK (Amount >= 0) ); ``` 这里的 `Amount` 列有一个检查约束,确保金额始终大于等于零。 通过这些约束,你可以有效地控制和管理数据库中的数据质量,保证应用程序能够正常运行。当设计数据库结构时,合理应用这些约束至关重要。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值