MYSQL DDL(数据库定义语言) 常用约束 标识列

本文详细介绍了MySQL数据库定义语言(DDL)中的常用约束,包括列级约束和表级约束,如非空、默认、主键、唯一和外键约束。此外,还讲解了如何在创建和修改数据表时添加约束。最后,讨论了标识列(AUTO_INCREMENT)的使用及其规则,强调其必须与主键或唯一约束结合,并且一个表只能有一个标识列。
摘要由CSDN通过智能技术生成

常用约束分类:列级约束  和  表级约束

一、概述

CREATE TABLE 数据表名 (

列名1  列数据类型  【列级约束1】 # 由于列级约束不支持取名,外键又有取名需求,不支持外键,但不会报错。

列名2 列数据类型    【列级约束1】【列级约束2】...,#允许添加多个列级约束,约束类型之间用  空格 隔开。

.........

【表级约束】 #不支持非空约束和默认约束,一般只用于写外键约束

说明:如果没有加约束,对于一个学生信息表,就可能由于粗心,导致第一行和第二行 出现重复序号,重复学号,显然不合理。就可以添加约束避免。

  • 列级约束语法:(不支持取名,不支持外键约束)

直接在列数据类型后面加约束类型关键字(NOT NULL/DEFAULT...)即可。

  • 表级约束语法 (可以为约束取名)

在数据表的最后一个列名之后,可添加表级约束。

【CONSTRAINT  约束名】  约束类型(列名), # 约束名,就是为这个约束的名字,随便取,但是主键名就是PRIMARY,改了别的名字也没用。 约束类型就是NOT NULL等。  注意,所有约束类型都有默认名,所以允许不给约束取名字,即constraint部分省略也没事。

  • 一般写法

一般一个表都可以有多个外键(取名区分外键)  并且  外键只支持表级约束,

所以  外键约束写表级约束,其他约束都写成列级约束。外键约束取名规则一般为 FK_本表名_引用的主表名

二、约束类型 五大约束 (其他数据库还有check约束,由于是mysql,就没有啦)

1、NOT NULL:非空约束  指  该列值不能为空,必须填。  比如姓名,学号,可添加非空约束。就像我们填写网络表格的时候,那些带*要求的必填项。

2、DEFAULT:默认约束 指 用于保证该列有默认值。比如对该列添加了默认约束以后,后续使用插入语句的时候不插入值也就没关系了,因为会显示默认值。 比如在女子学院,就可以对性别 添加 “女” 的默认约束。

格式 DEFAULT  +(该列数据类型对应的值)。比如默认年龄20岁: age INT DEFAULT 20,

3、PRIMARY KEY: 主键约束 指 用于保证该列的具有唯一性,并且主键自带非空性。比如学生表的学号,肯定唯一,就可以设置成主键。一个表中只能有一个。但是允许一个表的两列合并成一个主键。exp:PRIMARY KEY(列1,列2), 指列1和列2 合并成一个主键。合并完成以后,新插入行的列1和列2同时 和前面的数据相同 才会报错。

4、UNIQUE: 和PRIMARY KEY一样,差异就是UNIQUE允许为空,同时允许设置多个UNIQUE。用于不能重复,但允许为空的列,比如座位号,就不能重复,但可以空,就可以设置成UNIQUE。同样允许多列合并组合成新主键

5、FOREIGN KEY: 外键约束  限制两个表的关系,用于保证该列的值必须来自于主表关联列的值。☆在从表添加外键约束,代表此列引用的主表的某列的值。注意外键约束的两个表的列,数据类型必须一致。常用的外键约束有,专业编号,部门编号,工种编号。由于一个表可以有多个外键,而列级约束不支持取名,所以不能用于列级约束,只用于表级约束。通用取名方式为:FK_本表名_引用的主表名。

☆:外键引用的其他主表的列,必须是一个KEY,(一般是PRIMARY 或者 UNIQUE,最好是PRIMARY)

格式:【CONSTRAINT 约束名 FOREIGN KEY('列名') REFERANCES 主表名(列名);

下表:CONSTRAINT fk_学生表_专业表  FOREIGN KEY(‘专业ID’ ) REFERENCES `专业表`(‘专业ID’);

三、添加约束的应用

3.1、创建数据表的时候 

(1)添加列级约束      直接在列数据类型后面加约束类型关键字

CREATE TABLE  StuInfo(

id INT PRIMARY KEY,    #列名 id,数据类型 INT , 约束 PRIMARY KEY(主键)

StuName VARCHAR(20) NOT NULL, #列名StuName,数据类型VARCHAR,约束NOT NULL(非空) 

SeatNo INT UNIQUE ,#列名SeatNo,数据类型INT,约束UNIQUE(唯一约束,允许空)

age INT DEFAULT 18, #列名age,数据类型INT,约束DEFAULY(默认约束,默认值18)

);

(2)添加表级约束    【CONSTRAINT  约束名】 约束关键词(列名)

CREATE TABLE  StuInfo(

id INT ,  

StuName VARCHAR(20) , 

SeatNo INT ,

age INT DEFAULT 18,

 CONSTRAINT PK PRIMARY KEY(id),  #列名 id,添加 约束 PRIMARY KEY(主键)

 CONSTRAINT uq UNIQUE(SeatNo),#列名SeatNo,添加 约束UNIQUE(唯一约束,允许空)

 CONSTRAINT fk FOREIGN KEY(majorID) REFERENCES major(id),  #列名 majorID,添加 约束FOREIGN KEY(外键约束,引用主表major的id列)

);

3.2、修改数据表的时候

ALTER TABLE 数据表名 MODIFY COLUMN 列名 列数据类型 约束类型;(常用列级约束写法)

ALTER TABLE 数据表名 ADD 约束类型(列名);(表级约束写法)

可添加非空约束,默认约束,主键,外键(外键只有表级写法

例如:把前面StuInfo数据表里的年龄列的默认值从18改成24 (默认约束例子)

ALTER TABLE StuInfo MODIFY COLUMN age INT DEFAULT 24;

例如:把StuInfo的ID,添加主键(假如前面没有设置主键)(主键约束例子)

ALTER TABLE StuInfo MODIFY COLUMN id INT PRIMARY KEY ; #列级写法

ALTER TABLE StuInfo ADD 【CONSTRAINT fk】 PRIMARY KEY(id);  #表级写法

例如:给StuINfo数据表的majorID 添加外键约束,关联主表为major的id项(外键约束例子)

ALTER TABLE StuInfo ADD FOREIGN KEY(majorID) REFERENCES major(id);

3.3 删除约束

1、删除非空约束、默认约束、主键,唯一(支持列级写法的)都可以直接用3.2的方法,把约束改成没有就是了。

2、删除主键、唯一的表级写法:

ALTER TABLE 数据表名 DROP PRIMARY KEY;  #主键只有一个,可以这样写

ALTER TABLE 数据表名 DROP INDEX 唯一键的名字;  #UNIQUE唯一键可以有多个,所以用索引来删除。唯一键的名字,可通过  SHOW INDEX FROM 数据表;  来查询。

3、删除外键(外键没列级写法,只能表级写法删除)

ALTER TABLE 数据表名 DROP FOREIGN KEY 外键名;

四、标识列 AUTO_INCREMENT

    又称为自增长列,可以不用手动插入值,系统提供默认的序列值,默认从1开始,每次插入自动+1。一旦设置了标识列以后,插入就很省事了

语法: 创建数据表、修改数据表时,在想要自增的列约束后面添加  AUTO_INCREMENT

说明:加入自增长以后,插入数据时,对应的列就不用管了,但为了表达式美观,可以写个NULL。起始值默认是1,但是你想起始值是10,可以在第一句id的位置写10,就可以从10开始了

#创建tab_identity数据表时创建一个标识列
CREATE TABLE tab_identity(
  id INT PRIMARY KEY AUTO_INCREMENT,
  NAME VARCHAR(20)
);
#创建成功以后,向数据表中插入数据即可使用,在id的位置,赋值10,因此从10开始自增长
INSERT INTO tab_identity(id,NAME) VALUES(10,'john');
#这种写法更省事,直接省略了自增列(标识列)id,接着10开始,lucy在第11位
INSERT INTO tab_identity(NAME) VALUES('lucy');

    如何更改公差(步长)

    SET auto_increment_increment = 3;  //即可按照1、4、7、10的顺序自动增长

总结:

(1)标识列必须只能和key搭配,即和  PRIMARY KEY,UNIQUE,FOREIGN KEY配合

(2)一个表至多一个标识列

(3)标识列的类型只能是数值型(int、float、double等),一般是int

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值