mysql 约束

/*
约束:
六大约束:
    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;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。 MySQL中约束保存在info...
    shadow雨轩阅读 624评论 0 1
  • mysql约束 1. 约束简介 关系型数据库系统和文件系统的一个不同点是,关系型数据库本身能保证存储数据的完整性,...
    王小冬阅读 228评论 0 0
  • 约束能保证数据的完整性和一致性。约束类型:主键约束、唯一约束、非空约束、默认约束、外键约束 主键约束(PRIMAR...
    原来是仙女阿阅读 214评论 0 0
  • 接下来的一些内容,我们需要提前学一些简单的sql语句,方便大家理解接下来的知识。 DDL—数据定义语言(Creat...
    不排版阅读 403评论 0 1
  • 1、NOT NULL 非空约束----字面意思 2、PRIMARY KEY 主键约束 3、UNIQUE KEY 唯...
    steamed_bun阅读 243评论 0 0