MySQL约束

**

一、基本概念

**

约束是对表中数据进行限定,保证数据的正确定、有效性和完整性

**

二、约束的分类

**

1.主键约束:Primary Key

1.注意:
    含义:非空且唯一
    一张表只能有一个字段为主键
    主键就是表中记录的唯一标识
2.在创建表的时候,添加主键约束
    CREATE TABLE person(
        id int primary key, -- 编号,并添加主键约束
        NAME varchar(20)
    );

3.在创建表完后,添加主键约束
    ALTER TABLE person MODIFY id INT PRIMARY KEY;

4.删除主键约束
    -- 不用声明是哪个字段,因为一个表中有且仅有一个主键约束
    ALTER TABLE person DROP PRIMARY KEY;

5.自动增长
    1.概念:如果某一列是数值类型的,使用关键字auto_increment可以完成值的自动增长
          该关键字通常和int类型主键一起配合使用
    2.在创建表时,添加主键约束,并完成主键的自动增长
        CREATE TABLE person(
            id INT PRIMARY KEY AUTO_INCREMENT, -- 编号,设置主键约束,并完成自动增长
            NAME varchar(20) -- 姓名
        );

        -- 添加主键约束后,NAME不能为null,但因为添加了AUTO_INCREMENT关键字,所以可以添加成功,并自动增长为3
        INSERT INTO person(id, NAME) VALUES(NULL, "aaa");
    3.在创建表之后,添加自动增长
        AlTER TABLE person MODIFY id INT AUTO_INCREMENT;
    4.删除自动增长
        ALTER TABLE person MODIFY id INT; -- 该写法,自动增长可以删除,主键约束不可以删除

2.非空约束:not null,某一列值不能为null

1.创建表时添加约束
    -- 创建一个表
    CREATE TABLE person(
    	id INT, -- 编号
    	NAME VARCHAR(20) NOT NULL -- 姓名,并添加非空约束
    );

    SELECT * FROM person;	-- 查看表中的数据

    -- 向表中添加数据,NAME非空,可以添加成功
    INSERT	INTO person(id, NAME) VALUES(1, "张三");
    -- 向表中添加数据,NAME为NULL,不可以添加进数据库中,会报错
    INSERT	INTO person(id, NAME) VALUES(2, NULL);

2.创建表之后,再添加非空约束
  ALTER TABLE person MODIFY NAME VARCHAR(20) NOT NULL;

3.删除非空约束
    -- 删除NAME的非空约束
    ALTER TABLE person MODIFY NAME VARCHAR(20);

3.唯一约束:unique,某一列的值不能重复

1.在创建表时,添加唯一约束
   CREATE TABLE person(
      id INT, -- 编号
      phone_number VARCHAR(20) UNIQUE -- 手机号,并添加唯一约束
    );

2.在创建完表之后,添加唯一约束
    ALTER TABLE person MODIFY phone_number VARCHAR(20) UNIQUE;

3.删除唯一约束
    ALTER TABLE person DROP INDEX phone_number;

4.注意:
    唯一约束可以有NULL值,但是只能有一条记录为NULL

4.外键约束:foreign key

外键约束是让表与表之间产生关系,从而抱枕数据的正确性

1.在创建表时,可以添加外键
   语法:
        CREATE TABLE 表名(
            字段列表,
            ...,
            外键列
            constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
        );

2.在创建完表之后,再添加外键
    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键列名称) REFERENCES department(主表列名称)

3.删除外键
    ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

外键约束实例分析:

-- 创建emp表
CREATE TABLE emp(
	id INT PRIMARY KEY AUTO_INCREMENT, -- 编号,主键约束,自动增长
	NAME VARCHAR(30), -- 姓名
	age INT, -- 年龄
	dep_name VARCHAR(30), -- 工作部门名称
	dep_location VARCHAR(30) -- 工作地点
);
-- 添加数据
 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("张三", 18, "研发部门", "北京");
 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("李四", 18, "研发部门", "北京");
 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("王五", 20, "研发部门", "北京");
 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("赵六", 18, "销售部门", "上海");
 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("田七", 25, "销售部门", "上海");
 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("钱八", 20, "销售部门", "上海");
 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("孙九", 40, "管理部门", "深圳");
 INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ("张十", 35, "管理部门", "深圳");

 -- 查看emp表中的数据
 SELECT * FROM emp;

 -- 【存在的问题1】:数据有冗余,研发部门-北京,销售部门-上海,管理部门-深圳,这些都是重复数据
 -- 【1的解决办法】:表的拆分。拆成两张表,一张表存放员工信息,另一张表存放部门信息,然后关联两张表即可。
 
 -- 创建部门表(id, dep_name, dep_location)
CREATE TABLE department(
	id INT PRIMARY KEY AUTO_INCREMENT, -- 编号,主键约束,自动增长
	dep_name VARCHAR(20), -- 工作部门
	dep_location VARCHAR(20) -- 工作地点
);

-- 创建员工表(id, name, age, dep_id)
-- 【2的修改的地方】:添加外键约束让employee表的dep_id列【关联】department表的id列
-- 多方,从表
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT, -- 编号,主键约束,自动增长
	NAME VARCHAR(20), -- 姓名
	age INT, -- 年龄
	dep_id INT, -- 外键对应主表的主键
	CONSTRAINT emp_dep_id FOREIGN KEY (dep_id) REFERENCES department(id)
);

-- 【存在的问题2】:张三,李四,王五属于1号部门,但是1号部门可以随时删除掉,不符合现实逻辑,应该是部门的人删除掉以后,才能把部门删除掉
-- 【2的解决方案】:让employee表的dep_id列【关联】department表的id列

-- 删除emp表,department表,employee表
DROP TABLE emp;
DROP TABLE department;
DROP TABLE employee;

5.约束操作技巧

删除约束:

非空、唯一、主键、外键:只有第一个非空约束是用MODIFY,其他三个都是用DROP

添加约束:

非空、唯一、主键、外键:前三个是用MODIFY,只有最后一个外键约束是用ADD

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值