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);
相关推荐
AOwhisky4 小时前
MySQL 学习笔记(第四期):SQL 语言之多表查询
linux·运维·网络·数据库·笔记·学习·mysql
小红卒4 小时前
mysql之udf提权
数据库·mysql·网络安全
Trouvaille ~4 小时前
【Redis篇】Redis 哨兵(Sentinel):高可用自动故障转移
数据库·redis·缓存·中间件·sentinel·高可用·哨兵
qfljg4 小时前
oracle 迁移到postgres
数据库·oracle
giaz14n9X5 小时前
Redis 分布式锁进阶第五十七篇
数据库·redis·分布式
剑神一笑5 小时前
Linux ls 命令深度解析:从目录遍历到颜色输出的实现原理
linux·服务器·数据库
Maynor9965 小时前
Codex API 网关迁移与流量优化实战
数据库·oracle
WyCAGy8ij6 小时前
Redis 分布式锁进阶第二篇讲解
数据库·redis·分布式
南极企鹅6 小时前
MySQL的两大支柱:undo Log&redo log
数据库·mysql·oracle
智航GIS6 小时前
ArcGIS大师之路500技---078文件数据库的加密与解密
数据库·arcgis