标题:[MySQL初阶]MySQL(3)表的约束
@水墨不写bug
约束的本质:
通过技术手段,倒逼程序员插入正确的数据。反过来,站在MySQL的角度,凡是插入的数据,一定是符合约束的正确的数据。
约束的目的:
保证数据的完整性和可预见性。
NULL
)。
NULL
:允许为空(默认)。NOT NULL
:字段必须包含值,否则插入会报错。username
和 password
必须为 NOT NULL
,避免数据不完整。address
可为 NULL
,允许用户暂时不填写。示例:
CREATE TABLE users (
user_id INT PRIMARY KEY,
username VARCHAR(50) NOT NULL, -- 必填
email VARCHAR(100) NOT NULL, -- 必填
phone VARCHAR(20) NULL, -- 可选
other VARCHAR(20) -- 可选默认为null
);
pending
。CURRENT_TIMESTAMP
。示例:
CREATE TABLE IF NOT EXISTS orders (
order_id INT PRIMARY KEY,
status VARCHAR(20) DEFAULT 'pending', -- 默认状态
created_at DATETIME DEFAULT CURRENT_TIMESTAMP -- 自动记录时间
);
总的来说:not null和default相互补充,并不冲突。
示例:
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
salary DECIMAL(10,2) COMMENT '税前工资,单位为人民币', -- 注释说明
password_hash VARCHAR(100) COMMENT '使用SHA-256加密的密码'
);
运行sql语句:
show create table tb_name\G;
INT(5) ZEROFILL
存储 18
会显示为 00018
。注意不是二进制显示,比如a=2,int(5)zerofill显示出来是00002,而不是00010!!
显示的总位数(补0后为10,因为int(n)n默认为10,2 ^ 32 为 10^10级别;此外,int unsigned(n)n默认为11,因为需要多一位存储符号。
member_no INT(6) ZEROFILL
,显示为 000123
。示例:
CREATE TABLE members (
member_id INT PRIMARY KEY,
member_no INT(6) ZEROFILL -- 显示为6位,不足补零
);
NOT NULL
),自动创建索引。一张表最多只能有一个主键,主键所在的列通常为整形。示例:
CREATE TABLE products (
product_id INT PRIMARY KEY, -- 主键
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2)
);
alter table tb_name drop primary key;
alter table tb_name add primary key(col_name);--列名称
create table if not exists tb_name(
id int unsigned,
course_id int unsigned comment '课程编号',
score tinyint unsigned comment '课程成绩',
primary key(id,course_id) --设置复合主键
);
PRIMARY KEY
结合使用。如果没有指定起始值,则从1开始自增长。
被指定的字段在插入的时候不必考虑,这个字段会自动+1并填充给新插入的行。
中途插入新值,则会从当前字段已有的最大值开始+1并填充。
article_id
自动生成。示例:
CREATE TABLE articles (
article_id INT AUTO_INCREMENT PRIMARY KEY, -- 自增主键
title VARCHAR(200) NOT NULL,
content TEXT
);
select last_insert_id();
多用部分空间(内存)来存储数据的位置信息(类似于书的目录)。 本质是:以时间换空间。
NULL
值(除非结合 NOT NULL
)。其与主键相互补充,满足非主键类型数据的唯一性。
这就类似于我们已经设置了ID为主键,但是用户电话号码也不能冲突,所以可以把用户电话号码设置为unique唯一键。示例:
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(100) NOT NULL UNIQUE, -- 唯一且非空
phone VARCHAR(20) UNIQUE -- 唯一但可为空
);
用户表设计:
CREATE TABLE users (
user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户唯一ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名(唯一)',
email VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱(唯一)',
password VARCHAR(32) NOT NULL COMMENT '加密后的密码',
status ENUM('active', 'inactive') DEFAULT 'active' COMMENT '用户状态',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
member_no INT(6) ZEROFILL COMMENT '6位编号'
);
订单表设计:
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL COMMENT '关联用户ID',
order_no VARCHAR(20) NOT NULL UNIQUE COMMENT '唯一订单号',
amount DECIMAL(10,2) NOT NULL COMMENT '订单金额',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
根据以上两个简单的表的设计,我们就可以在此基础上实现订单和骑手送餐的代码逻辑,这就是mysql在实际业务中的应用。
完·~
转载请注明出处