MySQL——表的约束(上)

目录

前言

[一、空属性------NULL和NOT NULL](#一、空属性——NULL和NOT NULL)

二、默认值------DEFAULT

三、列描述------COMMENT

四、ZEROFILL

五、主键

[5.1 主键约束](#5.1 主键约束)

[5.2 复合主键约束](#5.2 复合主键约束)


前言

表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。

约束的本质是通过技术手段,倒逼程序员插入正确的数据。反过来,站在mysql的视角,凡是插入进来的数据,都是符合数据约束的。

约束的最终目标,是保证数据的完整性和可预期性。

一、空属性------NULL和NOT NULL

sql 复制代码
-- 空属性------NULL和NOT NULL
CREATE DATABASE IF NOT EXISTS test_key;
USE test_key;
SHOW TABLES;
CREATE TABLE IF NOT EXISTS myclass(
class_name VARCHAR(20) NOT NULL,
class_room VARCHAR(20) NOT NULL,
other VARCHAR(20)
);
DESC myclass;
SHOW CREATE TABLE myclass;
INSERT INTO myclass (class_name,class_room,other) VALUES('高三2班','101教室','普通版');
SELECT * FROM myclass;
INSERT INTO myclass (class_name,class_room) VALUES ('高三3班','103教室');
SELECT * FROM myclass;
INSERT INTO myclass (class_name) VALUES('高三3班','NULL');

二、默认值------DEFAULT

如果设置了DEFAULT,将来建表时,用户有插入具体的数据,就用用户插入的,负责就用默认值。

sql 复制代码
SHOW TABLES;
CREATE TABLE IF NOT EXISTS t1(
name VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED DEFAULT 18,
gender CHAR(1) DEFAULT '男'
);
DESC t1;
INSERT INTO t1 (name,age,gender) VALUES('张三',19,'女');
SELECT * FROM t1;
INSERT INTO t1 (name) VALUES ('李四');
SELECT * FROM t1;
SHOW CREATE TABLE t1;
INSERT INTO t1 (name,age,gender) VALUES (NULL,20,'男');
INSERT INTO t1 (age,gender) VALUES (20,'男');
INSERT INTO t1 (name,age,gender) VALUES('张三',20,NULL);
INSERT INTO t1 (name,age) VALUES ('张三',20);
SELECT * FROM t1;
INSERT INTO t1 (name,age,gender) VALUES ('张三',30,'女');
INSERT INTO t1 (name,age,gender) VALUES ('张三',NULL,'女');
INSERT INTO t1 (name,gender) VALUES ('张三','女');
SELECT * FROM t1;

CREATE TABLE IF NOT EXISTS t2(
name VARCHAR(20),
age TINYINT UNSIGNED
);
DESC t2;
INSERT INTO t2 (name,age) VALUES ('张三',18);
INSERT INTO t2 (name,age) VALUES (NULL,18);
INSERT INTO t2 (age) VALUES (18);
SELECT * FROM t2;

DEFAULT和NOT有如下区别和联系:

1.当我们将某一字段设置为NOT NULL后,插入数据时,插入'NULL'会报错,不让我们进行插入,只能插入合法数据。

2.当我们没有指定列名称和要插入的数据时,DEFAULT发挥作用,若有DEFAULT,就使用默认值,没有设置DEFAULT,就会报错。

三、列描述------COMMENT

sql 复制代码
-- 列描述------COMMENT
CREATE TABLE IF NOT EXISTS t3(
name VARCHAR(20) NOT NULL COMMENT '这个是用户的名称',
age TINYINT UNSIGNED DEFAULT 18 COMMENT '这个是用户的年龄',
gender CHAR(1) DEFAULT '男' COMMENT '这个是用户的性别'
);
DESC t3;
INSERT INTO t3 VALUES ('张三',19,'女');
SELECT * FROM t3;
SHOW CREATE TABLE t3;

四、ZEROFILL

ZEROFILL不影响存储,影响后续的格式化显示。

当插入数据的位数小于括号中指定的位数时,显示数据时自动补0。

当插入数据的位数大于括号中指定的位数时,就显示插入的数据。

sql 复制代码
-- ZEROFILL
SHOW TABLES;
CREATE TABLE IF NOT EXISTS t4(
a INT UNSIGNED NOT NULL,
b INT UNSIGNED NOT NULL
);
DESC t4;
SHOW CREATE TABLE t4;
INSERT INTO t4 (a,b) VALUES (1,2);
SELECT * FROM t4;
ALTER TABLE t4 MODIFY b INT UNSIGNED ZEROFILL NOT NULL;
DESC t4;
SELECT * FROM t4;
INSERT INTO t4 (a,b) VALUES (100,200);
SELECT * FROM t4;
SELECT * FROM t4 WHERE b = 200;
SELECT a,b FROM t4;
SELECT a,hex(b) FROM t4;
SELECT hex(3.14);
ALTER TABLE t4 MODIFY b INT(1) UNSIGNED ZEROFILL NOT NULL;
SELECT * FROM t4;
ALTER TABLE t4 MODIFY b INT(4) UNSIGNED ZEROFILL NOT NULL;
SELECT * FROM t4;
INSERT INTO t4 (a,b) VALUES (1,1);
INSERT INTO t4 (a,b) VALUES (1,11);
INSERT INTO t4 (a,b) VALUES (1,111);
INSERT INTO t4 (a,b) VALUES (1,1111);
INSERT INTO t4 (a,b) VALUES (1,11111);
INSERT INTO t4 (a,b) VALUES (1,111111);
SELECT * FROM t4;
SELECT * FROM t4 WHERE b = 11111;
SELECT * FROM t4 WHERE b = 11;

五、主键

5.1 主键约束

主键:PRIMARY KEY用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键,主键所在的列通常是整数类型。

虽然一张表中只能有一个主键,但并不意味着一个表中的主键,只能添加给一列,一个主键可以添加到一列,或者多列上(复合主键)。

sql 复制代码
-- 主键约束
CREATE TABLE IF NOT EXISTS test_key(
id INT UNSIGNED PRIMARY KEY COMMENT '这个是学生的学号',
name VARCHAR(20) NOT NULL
);
DESC test_key;
SHOW CREATE TABLE test_key;
INSERT INTO test_key (id,name) VALUES (1,'张飞');
SELECT * FROM test_key;
INSERT INTO test_key (id,name) VALUES (2,'刘备');
SELECT * FROM test_key WHERE id = 1;
SELECT * FROM test_key WHERE id = 2;
UPDATE test_key SET name = '曹老板' WHERE id = 2;
SELECT * FROM test_key;
DESC test_key;
ALTER TABLE test_key DROP PRIMARY KEY;
DESC test_key;
INSERT INTO test_key (id,name) VALUES (2,'孙权');
SELECT * FROM test_key;
SHOW CREATE TABLE test_key;
ALTER TABLE test_key ADD PRIMARY KEY(id);
DELETE FROM test_key WHERE name = '孙权';
SELECT * FROM test_key;
ALTER TABLE test_key ADD PRIMARY KEY(id);
INSERT INTO test_key (id,name) VALUES (2,'孙权');
DESC test_key;
SELECT * FROM test_key;
INSERT INTO test_key (id,name) VALUES (3,'张飞');
SELECT * FROM test_key;

5.2 复合主键约束

sql 复制代码
-- 复合主键
CREATE TABLE IF NOT EXISTS pick_course(
id INT UNSIGNED,
course_id INT UNSIGNED COMMENT '课程编号',
score TINYINT UNSIGNED COMMENT '学生该课程考的分数',
PRIMARY KEY(id,course_id)
);
DESC pick_course;
INSERT INTO pick_course VALUES (1234,40,90);
INSERT INTO pick_course VALUES (1235,40,85);
SELECT * FROM pick_course;
INSERT INTO pick_course VALUES (1234,50,100);
INSERT INTO pick_course VALUES (1234,40,100);
相关推荐
lqg_zone20 分钟前
CentOS 7 虚拟机磁盘 I/O 卡顿排查实录:从 iostat 异常到虚拟盘后端故障的完整定位
linux·服务器·mysql·centos
程序猿乐锅40 分钟前
【黑马点评 | 第四篇】Redis缓存雪崩
java·数据库·spring boot·redis·缓存
Sun 32851 小时前
集中式主备中,CM、OM 和 DN 是怎样协作的?
数据库·opengauss·cm·磐维数据库·集中式·om·dn
不正经的码狗1 小时前
# Navicat Premium 17 安装使用指南
mysql·navicat premium
其实防守也摸鱼1 小时前
堆叠注入(Stacked Injection)详解
服务器·数据库·windows·https·ssl
两点王爷10 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
两点王爷10 小时前
PostgreSQL 好用又独特的特性与空间函数
数据库
梦帮科技10 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法
TDengine (老段)11 小时前
TDengine 常见问题 TOP3
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
螺蛳粉 螺蛳粉14 小时前
MySQL 分布式集群系列 · 第五篇——全方位对比:NDB、MGR、主从复制、分库分表怎么选?
数据库·分布式·mysql