自增主键
自增主键是数据库设计中常用的一种主键生成策略,它指的是在插入新记录时,主键列的值会自动递增。
优点:
- 唯一标识每条记录:确保每条记录在表中都是唯一的
- 确保数据完整性:通过主键的唯一性,避免数据的重复和混乱
- 便于mysql主键索引的维护,如果类型为用户任意输入,可能会导致 B+tree 分裂
1.例如设置主键自增
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL, # 非空email VARCHAR(100) NOT NULL UNIQUE, # 唯一邮箱 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, # 当前时间is_active BOOLEAN DEFAULT TRUE # 布尔类型
);
2.插入数据,id列 不用插入可以实现自增
主键约束
主键约束通过在表中定义一个或多个列(即复合主键)来确保每条记录在这些列的组合上具有唯一性。主键列的值不能为NULL,也不能重复
1.学生id使用主键约束,确保 id 唯一
CREATE TABLE Students (StudentID INT PRIMARY KEY,FirstName VARCHAR(50),LastName VARCHAR(50)
);
非空约束
与非空对应的就是default了。在不插入数据的情况下设置默认值
1.字段的记录值名字非空且唯一(not null)
CREATE TABLE `test1` (`name` varchar(255) NOT NULL,PRIMARY KEY (`name`)
)
2.设置(字段1 字段2 字段3)属性1 属性2 属性3
CREATE TABLE xxs (id INT AUTO_INCREMENT PRIMARY KEY, # 自增主键,用于唯一标识每一条记录student_id VARCHAR(20) NOT NULL, # 学号,全局唯一exam_id VARCHAR(20), # 考号student_name VARCHAR(50), # 学生姓名exam_name VARCHAR(50), # 考试名称UNIQUE KEY (student_id) # 定义学号的唯一约束
);
default 设置
1.举例,给学生爱好设置为非空,如果空则默认是 “read_book”
CREATE TABLE student (student_id INT PRIMARY KEY,name VARCHAR(100),hobby VARCHAR(100) NOT NULL DEFAULT 'read_book'
);
2.插入数据分别为默认hobby和手动设置hobby
mysql> INSERT INTO student (student_id, name) VALUES (433, 'wzy');
Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO student (student_id, name, hobby) VALUES (434, 'wzy', 'swimming');
Query OK, 1 row affected (0.00 sec)
3.查验数据OK
mysql> select * from student;
+------------+------+-----------+
| student_id | name | hobby |
+------------+------+-----------+
| 433 | wzy | read_book |
| 434 | wzy | swimming |
+------------+------+-----------+
唯一约束
确保输入的列在当字段唯一,例如输入手机号
CREATE TABLE phone_number (number int not null unique
);
外键约束
-
外面的键,一张表的一个字段(非主键)指向另外一个表的主键,那么该字段就称之为外键
-
外键所在的表称之为子表(附表); 外键所指向的主键所在的表称之为父表(主表)
-
外键约束
-
插入约束:外键(也叫子表)插入数据时,该数据必须在父表存在,注意父表插入新的值,子表也不会继承
-
删除约束:子表使用了外键,不能删除父表;而是先删子表,再删父表
-
1.创建教室表作为父表,然后写入内容(如下图)
create table class(id int primary key auto_increment,name varchar(10) not null comment "班级名字,不能为空",room varchar(10) comment '教室:允许为空'
);
2.创建学生表使用外键,查看候选 class_id
只能从父表id取值
create table student(id int primary key auto_increment,number char(10) not null unique comment "学号:不能重复",name varchar(10) not null comment "姓名",class_id int,foreign key(class_id) references class(id)
);
3.尝试删除父表 class,提示有外键不能直接删除
mysql> drop table class;
ERROR 3730 (HY000): Cannot drop table 'class' referenced by a foreign key constraint 'student_ibfk_1' on table 'student'.
4.先删除字表,然后就可以删除父表了
mysql> drop table student;
Query OK, 0 rows affected (0.01 sec)mysql> drop table class;
Query OK, 0 rows affected (0.01 sec)
非负约束
关键词:INT UNSIGNED
CHANGE COLUMNageageINT UNSIGNED NULL DEFAULT NULL ;
sql_mode
sql_mode
是 MySQL 中的一个系统变量,用于控制 SQL 语句的执行模式。sql_mode
可以包含多个模式,每个模式都定义了 MySQL 应该如何处理 SQL 语句的某些方面。例如,它可以控制 MySQL 如何处理无效或遗漏的数据,以及如何执行数据类型的隐式转换。
==提示:==如果主库关闭了sqo_mode,而从库开启了严格的sql_mode会导致主从建立失败
1.查看当前的sql_mode
mysql> select @@sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
ONLY_FULL_GROUP_BY
: 要求在使用GROUP BY
子句时,SELECT
列表中的所有非聚合列都必须出现在GROUP BY
子句中,有助于避免在分组查询中出现不确定的结果STRICT_TRANS_TABLES
: 在无法将一个值插入到一个事务表中时产生错误,而不是警告,并且不允许无效或遗漏的值,有助于确保数据的完整性NO_ZERO_IN_DATE
: 不允许日期部分为零的值(例如 ‘2010-00-00’),有助于避免日期值的歧义NO_ZERO_DATE
: 不允许日期完全为零的值(例如 ‘0000-00-00’),同样有助于避免日期值的歧义ERROR_FOR_DIVISION_BY_ZERO
: 在除以零时产生错误,而不是返回NULL
或Infinity
,有助于避免在计算中出现未定义的结果NO_ENGINE_SUBSTITUTION
: 如果指定的存储引擎不可用,则产生错误,而不是使用默认的存储引擎,有助于确保应用程序使用的存储引擎是可用的
2.假设现在有一个字段为 date
类型,因为sql_mode 的存在,所以不能随意插入数据。这样一顿操作后,数据就可以随意插入了
mysql> set global sql_mode='';
Query OK, 0 rows affected (0.00 sec)mysql> quit
[root@db51~]# mysqlmysql> select @@sql_mode;
+------------+
| @@sql_mode |
+------------+
| |
+------------+
1 row in set (0.00 sec)
更多的sql_mode
ANSI
: 使 MySQL 的行为更接近 ANSI SQL 标准。STRICT_TRANS_TABLES
: 在无法将一个值插入到一个事务表中时产生错误,而不是警告,并且不允许无效或遗漏的值。STRICT_ALL_TABLES
: 类似于STRICT_TRANS_TABLES
,但是对所有存储引擎都有效,不仅仅是事务表。NO_ZERO_IN_DATE
: 不允许日期部分为零的值(例如 ‘2010-00-00’)。NO_ZERO_DATE
: 不允许日期完全为零的值(例如 ‘0000-00-00’)。ERROR_FOR_DIVISION_BY_ZERO
: 在除以零时产生错误。NO_ENGINE_SUBSTITUTION
: 如果指定的存储引擎不可用,则产生错误,而不是使用默认的存储引擎。PIPES_AS_CONCAT
: 将||
视为字符串连接操作符,而不是逻辑 OR。ANSI_QUOTES
: 允许使用双引号来引用标识符。IGNORE_SPACE
: 忽略函数名后面的空格。NO_AUTO_CREATE_USER
: 禁止使用GRANT
语句自动创建新用户。NO_AUTO_VALUE_ON_ZERO
: 当插入的值为零时,禁止自动增加字段的值。NO_BACKSLASH_ESCAPES
: 禁止使用反斜杠作为转义字符。NO_DIR_IN_CREATE
: 在CREATE TABLE
语句中禁止使用TYPE=MyISAM
。NO_ENGINE_SUBSTITUTION
: 如果指定的存储引擎不可用,则产生错误。NO_FIELD_OPTIONS
: 禁止在SHOW CREATE TABLE
中显示字段选项。NO_KEY_OPTIONS
: 禁止在SHOW CREATE TABLE
中显示索引选项。NO_TABLE_OPTIONS
: 禁止在SHOW CREATE TABLE
中显示表选项。NO_UNSIGNED_SUBTRACTION
: 禁止无符号整数之间的减法操作。NO_FIELD_ADD
: 禁止动态添加字段。NO_USER_TABLES
: 禁止使用--skip-grant-tables
选项时访问用户表。NO_FIELD_MODIFY
: 禁止动态修改字段。NO_AUTO_CREATE_USER
: 禁止使用GRANT
语句自动创建新用户。NO_AUTO_VALUE_ON_ZERO
: 当插入的值为零时,禁止自动增加字段的值。NO_BACKSLASH_ESCAPES
: 禁止使用反斜杠作为转义字符。NO_DIR_IN_CREATE
: 在CREATE TABLE
语句中禁止使用TYPE=MyISAM
。NO_ENGINE_SUBSTITUTION
: 如果指定的存储引擎不可用,则产生错误。NO_FIELD_OPTIONS
: 禁止在SHOW CREATE TABLE
中显示字段选项。NO_KEY_OPTIONS
: 禁止在SHOW CREATE OR REPLACE TABLE
中显示索引选项。NO_TABLE_OPTIONS
: 禁止在SHOW CREATE TABLE
中显示表选项。NO_UNSIGNED_SUBTRACTION
: 禁止无符号整数之间的减法操作。NO_FIELD_ADD
: 禁止动态添加字段。NO_USER_TABLES
: 禁止使用--skip-grant-tables
选项时访问用户表。
CREATE TABLE` 中显示字段选项。NO_KEY_OPTIONS
: 禁止在SHOW CREATE OR REPLACE TABLE
中显示索引选项。NO_TABLE_OPTIONS
: 禁止在SHOW CREATE TABLE
中显示表选项。NO_UNSIGNED_SUBTRACTION
: 禁止无符号整数之间的减法操作。NO_FIELD_ADD
: 禁止动态添加字段。NO_USER_TABLES
: 禁止使用--skip-grant-tables
选项时访问用户表。NO_FIELD_MODIFY
: 禁止动态修改字段。