数据库约束概述
约束的作用
对表中的数据进行限制,保证数据的正确性、有效性和完整性。
一个表如果添加了约束,不正确的数据将无法插入到表中。
约束在创建表的时候添加比较合适。
约束种类
约束名 约束关键字 主键 primary key 唯一 unique 非空 not null 外键 foreign key
主键约束
主键作用
用来唯一标识数据库中的每一条记录(非空、唯一)
哪个字段应该作为表的主键呢?
通常不用业务字段作为主键,单独给每张表设计一个id字段,把id设为主键。主键是给数
据库和程序使用的,不是给最终的客户使用的,所以主键有没有含义没有关系,只要不重
复,非空就行。如:身份证,学号不建议做成主键
创建主键
-- 在创建表的时候给字段添加主键
CREATE TABLE stu(
id INT PRIMARY KEY,
name VARCHAR(20),
age INT
);
-- 插入重复的主键值
INSERT INTO stu VALUES (1, '关羽', 30);
-- 错误代码: 1062 Duplicate entry '1' for key 'PRIMARY'
INSERT INTO stu VALUES (1, '关云长', 20);
-- 插入 NULL 的主键值, Column 'id' cannot be null
INSERT INTO stu VALUES (NULL, '关云长', 20);
删除主键
-- 删除主键
ALTER TABLE stu DROP PRIMARY KEY;
-- 添加主键
ALTER TABLE stu ADD PRIMARY KEY(id);
主键自增(AUTO_INCREMENT )
如果让我们自己添加很有可能重复,我们通常希望在每次插入新纪录时,数据库自动生成主键字段的值。
-- 默认地 AUTO_INCREMENT 的开始值是 1,如果希望修改起始值,请使用下列 SQL 语法
CREATE TABLE tb_name(
列名 int primary key AUTO_INCREMENT
) AUTO_INCREMENT=起始值;
-- 创建好以后修改起始值
ALTER TABLE tb_name AUTO_INCREMENT=起始值;
唯一约束
表的某一列不能出现重复的值
-- 创建学生表 stu1, 包含字段(id, name),name 这一列设置唯一约束,不能出现同名的学生
CREATE TABLE stu1 (
id INT,
NAME VARCHAR(20) UNIQUE
);
-- 添加一个同名的学生
INSERT INTO stu1 VALUES (1, '张三');
-- Duplicate entry '张三' for key 'name'
INSERT INTO stu1 VALUES (2, '张三');
-- 重复插入多个 null 会怎样?
INSERT INTO stu1 VALUES (2, NULL);
INSERT INTO stu1 VALUES (3, NULL);
-- null 没有数据,不存在重复的问题
非空约束
某一列不能为空(NULL)
-- 创建表学生表 stu2, 包含字段(id,name,gender)其中 name 不能为 NULL
CREATE TABLE stu2 (
id INT,
NAME VARCHAR(20) NOT NULL,
gender CHAR(1)
);
-- 添加一条记录其中姓名不赋值
INSERT INTO stu2 VALUES (1,'张三疯','男');
-- Column 'name' cannot be null
INSERT INTO stu2 VALUES (2,NULL,'男');
默认值(DEFAULT)
-- 创建一个学生表 stu3,包含字段(id,name,address), 地址默认值是广州
CREATE TABLE stu3 (
id INT,
NAME VARCHAR(20),
address VARCHAR(20) DEFAULT '广州'
);
-- 添加一条记录,使用默认地址
INSERT INTO stu3 VALUES (1, '李四', DEFAULT);
INSERT INTO stu3 (id,NAME) VALUES (2, '李白');
-- 添加一条记录,不使用默认地址
INSERT INTO stu3 VALUES (3, '李四光', '深圳');
外键
一张表中字段设置为外键,可以被其他表所引用。删除记录的时候应注意,该外
键是否被其他表引用,如果已经被引用,则会删除失败。如果采用级联删除机制,
那么就会删除成功,但是不建议,由于误删会导致许多其他不应该被删掉的数据
被删掉。