MySQL数据库之创建表的列属性部分

  • 列属性
  • NOT NULL | NULL
  • DEFAULT default_value
  • PRIMARY KEY
  1. 每个表只能定义⼀个主键(但是主键中可以包含多个字段);
  2. 主键值必须唯⼀标识表中的每⼀⾏,且不能为NULL,即表中不可-能存在两⾏数据有相同的主键值。这是…
  3. ⼀个列名只能在复合主键列表中出现⼀次。
  4. 复合主键不能包含不必要的多余列。当把复合主键的某⼀列删除-后,如果剩下的列构成的主键仍然满⾜唯…
  • AUTO_INCREMENT

列属性

下⾯介绍列属性create_definition部分,每⼀列定义的具体格式如下

col_name type [NOT NULL|NULL][DEFAULT default_value][AUTO_INCREMENT]
[PRIMARY KEY][reference_definition]

列属性create_definition的参数说明如下

参数说明
col_name字段名
type字段类型
NOT NULLNULL
DEFAULT default_value表示默认值
AUTO_INCREMENT表示是否是自动编号,每个表只能有一个 AUTO_INCREMENT 列,并且必须被索引
PRIMARY KEY表示是否为主键。一个表只能有一个 PRIMARY KEY。如果表中没有一个 PRIMARY KEY,而某些应用程序需要 PRIMARY KEY,MySQL将返回第一个没有任何 NULL 列的 UNIQUE 键,作为 PRIMARY KEY
reference_definition为字段添加注释

NOT NULL | NULL

在数据库设计中,NOT NULL 是一项重要的约束条件,用于指定某个字段的数值在插入或更新记录时不能为NULL(空值)。这意味着该字段必须包含有效的数据,而不能留空。通过使用NOT NULL,可以确保数据库中的数据完整性,防止关键信息的缺失或无效输入。这在确保表中数据的准确性和一致性方面起到了关键的作用。对于那些在业务逻辑上要求具备确定值的字段,使用NOT NULL是一种有效的手段,以确保数据库中的数据始终处于可靠的状态。

先创建执⾏下⾯的建表语句,创建⼀张表:

#建表语句
CREATE TABLE run.run_stu1(
NAME VARCHAR(20) NOT NULL,
CLASS VARCHAR(20) NULL);

接着,执⾏INSERT语句,给表中写⼊数据。当执⾏下⾯第⼀条INSERT语句时,不会报错,当执⾏第⼆条INSERT语句时,报错为:SQL 错误 [1048] [23000]: Column ‘NAME’ cannot be null。

INSERT INTO run.run_stu1 (NAME, CLASS) VALUES ('', 'class3');
INSERT INTO run.run_stu1 (NAME, CLASS) VALUES (NULL, 'class3');

所以,NOT NULL的字段是不能插⼊NULL的,只能插⼊空值’‘。
空值’'和NULL有什么不⼀样呢?它们有⼀个很重要的区别在于:
1.空值是不占⽤空间的;
2. MySQL中的NULL其实是占⽤空间的。
⽐如,执⾏下⾯的SQL语句:

SELECT LENGTH(NULL), LENGTH(''), LENGTH('1')
返回结果如下
在这里插入图片描述
我们会发现空值’'的⻓度是0,是不占空间的。⽽NULL的⻓度是NULL,是需要占⽤额外空间的,所以在⼀些开发规范中,建议将数据库字段设置为NOT NULL。

DEFAULT default_value

在数据库设计中,DEFAULT default_value 是一项用于设置字段默认值的约束条件。当插入新记录时,如果未提供该字段的值,系统将自动使用指定的默认值。这提供了一种便捷的方式,使得在没有明确提供值的情况下,数据库可以自动填充字段,确保数据表中的每一行都包含有意义的信息。

通过使用DEFAULT关键字,可以在创建表时或修改表结构时为字段设置默认值。这对于那些在大多数情况下都具有相同值的字段特别有用,从而减少了插入操作中的繁琐性。

例如,假设有一个表示用户状态的字段,可以将其默认值设置为"Active",以确保在插入新用户记录时,如果未指定状态,系统将自动将其设置为"Active"。

综而言之,DEFAULT default_value 是一项有助于简化数据插入过程、提高数据表一致性的重要特性。

数据类型规范中的DEFAULT值⼦句显示地指定列的默认值。举个例⼦,假如MySQL中有⼀张如下的表:

CREATE TABLE IF NOT EXISTS DB_FNDN.STUDENT(
NAME VARCHAR(20) NOT NULL COMMENT '姓名',
AGE INT NOT NULL DEFAULT 18 COMMENT '年龄'
)

其中NAME和AGE列都为NOT NULL,不同的是AGE有⼀个DEFAULT 18的⼦句。接下来分别执⾏以下四个SQL语句:

--1.不指定任何⼀列
INSERT INTO DB_FNDN.STUDENT() VALUES();
--2.只指定NAME列
INSERT INTO DB_FNDN.STUDENT(NAME) VALUES('TOM');
--3.只指定NAME列,并且显示赋值为NULL
INSERT INTO DB_FNDN.STUDENT(NAME) VALUES(NULL);
--4.指定NAME和AGE列,AGE列显示赋值为NULL
INSERT INTO DB_FNDN.STUDENT(NAME,AGE) VALUES('TOM',NULL);
  • 当我们执⾏第⼀条语句时,会有⼀个报错提醒:SQL 错误 [1364] [HY000]: Field ‘NAME’ doesn’t have a default value。这是因为:NAME列定义为NOT NULL,如果插⼊时不包含该列,则MySQL会赋值为显示定义的默认值,如果没有则会报错Field ‘NAME’ doesn’t have a default value。
    在这里插入图片描述
  • 当我们执⾏第⼆条语句时,没有报错提醒。然后查询该表会有如下信息。这是因为:AGE列定义为NOTNULL,如果插⼊时不包含该列,则MySQL会赋值为显示的默认值。
    在这里插入图片描述
  • 当我们执⾏第三条语句时,会有⼀个报错提醒:SQL 错误 [1048] [23000]: Column ‘NAME’ cannot be
    null。这是因为:如果⼀列定义为NOT NULL,并且插⼊时包含该列,如果赋予该列的值为NULL,则会报错Column ‘NAME’ cannot be null。
    在这里插入图片描述
  • 当我们执⾏第四条语句时,会有⼀个报错提醒。报错原因和执⾏第三条语句时⼀样。

PRIMARY KEY

PRIMARY KEY 是数据库设计中的一项重要概念,用于定义表中的主键。主键是一列或一组列,其值能够唯一标识表中的每一行数据。通过将某列或列组指定为主键,可以确保表中的每个数据行都具有唯一的标识符。

在创建表时使用 PRIMARY KEY 约束,可以为表中的某一列或多列指定主键。主键的作用在于提供了一种快速、有效地查找和定位表中特定行的方法,同时还确保了数据的唯一性。

举例来说,如果有一个名为 user 的表,其中包含用户信息,可以将 user_id 列指定为主键。这样,每个用户都有一个唯一的标识符,便于快速准确地检索、更新或删除特定用户的信息。

总体而言,PRIMARY KEY 在数据库设计中是至关重要的,它不仅确保了数据的完整性和唯一性,还提高了数据库查询的性能。

主键约束字段的选取 :

  1. 每个表只能定义⼀个主键(但是主键中可以包含多个字段);
  2. 主键值必须唯⼀标识表中的每⼀⾏,且不能为NULL,即表中不可能存在两⾏数据有相同的主键
    值。这是唯⼀性原则。

举个例⼦,假如MySQL中有⼀张如下的表:

CREATE TABLE IF NOT EXISTS DB_FNDN.STUDENT1(
NAME VARCHAR(20) NOT NULL PRIMARY KEY COMMENT '姓名',
AGE INT NOT NULL DEFAULT 18 COMMENT '年龄'
)

其中NAME列为PRIMARY KEY,接下来分别执⾏以下两个SQL语句:

--1.向表中插⼊⼀条数据,这条数据中NAME列的值为'TOM'
INSERT INTO DB_FNDN.STUDENT1(NAME) VALUES('TOM');
--2.向表中插⼊⼀条数据,这条数据中NAME列的值还是'TOM'
INSERT INTO DB_FNDN.STUDENT1(NAME) VALUES('TOM');

当我们执⾏第⼀条语句时,没有报错。
当我们执⾏第⼆条语句时,报错信息为:SQL 错误 [1062] [23000]: Duplicate entry ‘TOM’ for key’PRIMARY’。其中Duplicate entry的意思是:重复条⽬。

  1. ⼀个列名只能在复合主键列表中出现⼀次。
  2. 复合主键不能包含不必要的多余列。当把复合主键的某⼀列删除后,如果剩下的列构成的主键仍
    然满⾜唯⼀性原则,那么这个复合主键是不正确的。这是最⼩化原则。

AUTO_INCREMENT

⾃增字段(AUTO_INCREMENT):

  1. ⼀个表只能有⼀个⾃增⻓字段;
  2. ⾃增⻓的字段⼀定配合主键使⽤,也就是说“被标识为⾃增⻓的字段”,⼀定是主键;
  3. ⾃增⻓只对整数列有效,对字符串⽆意义。
    举个例⼦,加⼊MySQL中有⼀张如下的表:
CREATE TABLE IF NOT EXISTS DB_FNDN.STUDENT3(
ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',
STUDENT_ID BIGINT(20) NOT NULL COMMENT '学号',
CLASS_ID INT NOT NULL COMMENT '班级'
)

其中ID列为AUTO_INCREMENT,接下来分别执⾏以下三个SQL语句:

INSERT INTO DB_FNDN.STUDENT3(STUDENT_ID,CLASS_ID) VALUES(123,1);
INSERT INTO DB_FNDN.STUDENT3(STUDENT_ID,CLASS_ID) VALUES(234,2);
INSERT INTO DB_FNDN.STUDENT3(STUDENT_ID,CLASS_ID) VALUES(345,1);

执⾏完上述三条插⼊语句后,再执⾏查询语句,会发现:ID列⾃动被赋予了值。

在这里插入图片描述
在这里插入图片描述

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值