目录
[一、空属性------NULL和NOT NULL](#一、空属性——NULL和NOT NULL)
[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);
