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);
相关推荐
小娄~~1 小时前
IO模型与并发服务器
运维·服务器·数据库
2401_884454151 小时前
CSS如何快速实现网站换肤功能_利用CSS变量重置全局颜色方案
jvm·数据库·python
fengxin_rou1 小时前
数据库三大范式深度详解:数据表设计规范化实战指南
数据库·mysql·范式
2301_809244531 小时前
PHP函数是否支持调用FPGA设备_PHP与FPGA硬件交互的实现方式【教程】
jvm·数据库·python
li星野1 小时前
Function Call 完全指南:让大模型从“聊天”到“行动”
数据库·oracle
!chen1 小时前
Oracle Deep Data Security (Deep Sec) 初体验
数据库·oracle·ffmpeg
淘矿人1 小时前
Claude助力前端开发
java·数据库·git·python·sql·spring·database
weixin_444012931 小时前
Go语言GORM怎么做分页_Go语言GORM分页查询教程【实用】
jvm·数据库·python
Java成神之路-2 小时前
面试题:如何利用联合索引提升性能?
mysql