美文网首页
mysql 约束

mysql 约束

作者: 哈斯勒 | 来源:发表于2019-08-26 19:00 被阅读0次
/*
约束:
六大约束:
    not null:   非空,用于保证该字段的值不能为空,  比如姓名 学号等
    default:    默认, 用于保证该字段有默认值  比如性别
    primary key:    主键,用于保证该字段的值具有唯一性,并且非空, 比如学号
    unique: 唯一, 用于保证该字段的值具有唯一性
    check:      检查约束,mysql不支持 , 比如年龄
    foreign key:    外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值, 比如 专业
                  在从表添加外键约束,用于引用主表中某列的值,  比如专业编号 部门编号 员工工种编号

添加约束的时机:
    1. 创建表时
    2. 修改表时
    
约束的添加分类:
    列级约束:
        六大约束语法上都支持,但外键约束没有效果
    表级约束:
        除了非空,默认,其他都支持
        
主键和唯一的对比:
        保证唯一性   是否允许为空      一个表中可以有几个   是否允许组合
    主键  √       ×           至多有一个       √ 但不推荐
    唯一  √       √(只允许一个为空)  可以有多个       √ 但不推荐
    
    insert into major values(1,'java');
    insert into major values(2,'h5');
    insert into stuinfo values(1,'john', '男', null, 19,1);
    insert into stuinfo values(2,'lily','男',null,19,2); 报错
        
外键:
    1. 要求在从表设置外键关系
    2. 从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
    3. 主表的关联列必须是一个key(一般是主键或唯一)
    4. 插入数据时,应该先插入主表数据,再插入从表
       删除时,顺序相反
        
create table 表名(
    字段名 字段类型 列级约束
    字段名 字段类型
    表级约束
)
*/
create table Book(
  bid int primary key,
 bname varchar(20) unique not null,
price float default 10,
btypeId int,
foreign key(btypeid) reference bookType(id)
);

#添加列级约束
/*
 语法:
      直接在字段名和类型后面添加约束类型即可
      只支持:默认、非空、主键、唯一
*/
CREATE DATABASE student;
USE student;
CREATE TABLE stuinfo(
    id INT PRIMARY KEY,#主键
    stuName VARCHAR(20) NOT NULL,
    gender CHAR(1) CHECK(gender='男' OR gender='女'), # gender in ('男',’女‘)
    seat INT UNIQUE,
    age INT DEFAULT 18,
    magiorid INT REFERENCES major(id)   
);

CREATE TABLE major(
    id INT PRIMARY KEY,
    majorName VARCHAR(20)
);
SELECT * FROM major;
SELECT * FROM stuinfo;
DESC stuinfo;

# 查看stuinfo表中所有的索引,包括主键,外键,唯一
SHOW INDEX FROM stuinfo;

#添加表级约束
/*
 语法:
 在各个字段的最下面
 [constraint 约束名] 约束类型(字段名)
      
*/

DROP TABLE IF EXISTS stuinfo;
CREATE TABLE stuinfo(
    id INT,#主键
    stuName VARCHAR(20),
    gender CHAR(1), 
    seat INT ,
    age INT ,
    majorid INT,
    CONSTRAINT pk PRIMARY KEY(id),#主键
    CONSTRAINT uq UNIQUE(seat), #唯一
    CONSTRAINT ck CHECK(gender='男' OR gender='女'),
    CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);

SHOW INDEX FROM stuinfo;


CREATE TABLE stuinfo(
    id INT,#主键
    stuName VARCHAR(20),
    gender CHAR(1), 
    seat INT ,
    age INT ,
    majorid INT,
    PRIMARY KEY(id),#主键
    UNIQUE(seat), #唯一
    CHECK(gender='男' OR gender='女'),
    FOREIGN KEY(majorid) REFERENCES major(id)
);

# 通用的写法

CREATE TABLE IF NOT EXISTS stuinfo(
    id INT PRIMARY KEY,
    stuName VARCHAR(20) NOT NULL,
    sex CHAR(1),
    seat INT UNIQUE,
    age INT DEFAULT 18,
    majorid INT,
    CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
);
# 修改表时添加约束
/*
1. 添加列级约束
alter table 表名 modify column 字段名 字段类型的约束;

2. 添加表级约束
alter table 表名 add [constraint 约束名] 约束类型(字段名)[外键的引用];

*/
CREATE TABLE stuinfo(
    id INT,#主键
    stuName VARCHAR(20),
    gender CHAR(1), 
    seat INT ,
    age INT ,
    majorid INT
);

# 添加非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NOT NULL;

ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NULL;

# 添加默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;

# 添加主键
#列级约束
ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
#表级约束
ALTER TABLE stuinfo ADD PRIMARY KEY(id);

#添加唯一约束
ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;

ALTER TABLE stuinfo ADD UNIQUE(seat);

#添加外键
ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id);
#修改表时删除约束
#1. 删除非空约束
ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;

#2. 删除默认约束
ALTER TABLE stuinfo MODIFY COLUMN age INT;

#3. 删除主键
ALTER TABLE stuinfo DROP PRIMARY KEY;

#4. 删除唯一
ALTER TABLE stuinfo DROP INDEX seat;

SHOW INDEX FROM stuinfo;

#5. 删除外键
ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;

        位置      支持的约束类型         是否可以起约束名
列级约束    列的后面    语法都支持,但外键没有效果   不可以
表级约束    所有列的下面  默认和非空不支持,其他支持   可以(主键没有效果)

# 标识列 自增长列
/*
 又称为自增长列
 含义:
    可以不用手动的插入值,系统提供默认的序列值
 
 特点:
   1. 标识列必须和主键搭配吗?不一定,但要求一定是key
   2. 一个表最多只能有一个标示列
   3. 标识列的类型只能是数值型 
   4. 标识列可以通过 set auto_increment_increment=3; 设置步长
      可以手动插入值设置起始值
     
*/
# 一,创建表时设置标识列
DROP TABLE IF EXISTS tab_identity;
CREATE TABLE IF NOT EXISTS tab_identity(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
);

INSERT INTO tab_identity VALUES(NULL,'john');
INSERT INTO tab_identity(NAME) VALUES('lucy');

SELECT * FROM tab_identity;

SHOW VARIABLES LIKE '%auto_increment%';

# 二。 修改表时设置标识列
ALTER TABLE tab_identiy MODIFY COLUMN id INT PRIMARY KEY AUTO_INCREMENT;

# 三。修改表时删除标识列
ALTER TABLE tab_identiy MODIFY COLUMN id INT;

相关文章

  • mysql 学习语句

    MySQL学习笔记 登录和退出MySQL服务器 基本语法 建表约束 主键约束 唯一主键 非空约束 默认约束 外键约...

  • mysql约束

    1, mysql 不支持外键约束 ,条件约束约束分为列级约束,primary 主键约束check 条件约束for...

  • MySQL基础——约束

    上篇文章我们学习了MySQL基础——函数,这篇文章我们学习MySQL基础——约束。 约束 约束是作用于表中字段上的...

  • mysql 约束

    接下来的一些内容,我们需要提前学一些简单的sql语句,方便大家理解接下来的知识。 DDL—数据定义语言(Creat...

  • MySQL约束

    mysql约束 1. 约束简介 关系型数据库系统和文件系统的一个不同点是,关系型数据库本身能保证存储数据的完整性,...

  • MySQL约束

    概念: 为了保证数据的完整性和一致性,MySQL提供了约束这个属性。约束分为表级约束和列级约束,如果约束只是针对某...

  • mySQl约束

    MYSQL的五种约束

  • MySQL约束

    PRIMARY KEY 主键 修改 删除 UNIQUE 唯一 添加 删除 FOREIGN KEY 修改 删除 删除...

  • mysql 约束

    主键约束表的主键设计策略任意两行都不具备相同的主键值每行都必须有一个主键值(主键不允许null列)主键和业务无关,...

  • MySQL约束

    1、NOT NULL 非空约束----字面意思 2、PRIMARY KEY 主键约束 3、UNIQUE KEY 唯...

网友评论

      本文标题:mysql 约束

      本文链接:https://www.haomeiwen.com/subject/hggdectx.html