lyt经典版MySQL基础——常见约束

  1 #常见约束
  2 /*
  3 含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
  4 
  5 分类:六大约束
  6     NOT NULL:非空,用于保证该字段的值不能为空
  7     比如姓名、学号等
  8     DEFAULT:默认,用于保证该字段有默认值
  9     比如性别
 10     PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空
 11     比如学号、员工编号等
 12     UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空
 13     比如座位号
 14     CHECK:检查约束【mysql中不支持】
 15     比如年龄、性别
 16     FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于
 17     主表的关联列的值
 18         在从表添加外键约束,用于引用主表中某列的值
 19     比如学生表的专业编号,员工表的部门编号,员工表的工种编号
 20 
 21 添加约束的时机:
 22     1.创建表时
 23     2.修改表时
 24     
 25 约束的添加分类:
 26     列级约束:
 27         六大约束语法上都支持,但外键约束没有效果
 28     表级约束:
 29         除了非空、默认,其他的都支持
 30         
 31 主键和唯一的大对比:
 32         保证唯一性    是否允许为空    一个表中可以有多少个    是否允许组合
 33     主键    √        x        至多有1个        √,但不推荐
 34     唯一    √        √        可以有多个        √,但不推荐
 35 外键:
 36     1、要求在从表设置外键关系
 37     2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
 38     3、主表的关联列必须是一个key(一般是主键或唯一键)
 39     4、插入数据时,先插入主表,再插入从表
 40     删除数据时,先删除从表,再删除主表
 41     
 42     insert into major values(1,'java');
 43     insert into major values(2,'h5');
 44     insert into stuinfo values(1,'john','男',null,19,1,1);
 45     insert into stuinfo values(2,'john','男',null,19,2,2);
 46 */
 47 
 48 CREATE TABLE 表名(
 49     字段名 字段类型 列级约束,
 50     字段名 字段类型,
 51     表级约束
 52 )
 53 
 54 #一、创建表时添加约束
 55 #1.添加列级约束
 56 /*
 57 语法:
 58 直接在字段名和类型后面追加 约束类型即可。
 59 只支持:默认、非空、主键、唯一
 60 */
 61 CREATE DATABASE students;
 62 USE students;
 63 CREATE TABLE stuinfo(
 64     id INT PRIMARY KEY,#主键
 65     stuName VARCHAR(20) NOT NULL,#非空
 66     gender CHAR(1) CHECK(gender='' OR gender=''),#检查约束
 67     seat INT UNIQUE,#唯一
 68     age INT DEFAULT 18,#默认约束    
 69     majorId INT REFERENCES major(id)#外键
 70 );
 71 
 72 DROP TABLE IF EXISTS major;
 73 CREATE TABLE major(
 74     id INT UNIQUE,
 75     majorName VARCHAR(20)
 76 );
 77 DESC stuinfo;
 78 #查看stuinfo表中所有的索引,包括主键、外键、唯一
 79 SHOW INDEX FROM stuinfo;
 80 
 81 #2.添加表级约束
 82 /*
 83 语法:在各个字段的最下面
 84 【constraint 约束名】 约束类型(字段名)
 85 */
 86 DROP TABLE IF EXISTS stuinfo;
 87 CREATE TABLE stuinfo(
 88     id INT,
 89     stuname VARCHAR(20),
 90     gender CHAR(1),
 91     seat INT,
 92     age INT,
 93     majorid INT,
 94     
 95     CONSTRAINT pk PRIMARY KEY(id),#主键
 96     CONSTRAINT uq UNIQUE(seat),#唯一
 97     CONSTRAINT ck CHECK(gender='' OR gender=''),#检查
 98     CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外键
 99 );
100 
101 DROP TABLE IF EXISTS stuinfo;
102 CREATE TABLE stuinfo(
103     id INT,
104     stuname VARCHAR(20),
105     gender CHAR(1),
106     seat INT,
107     age INT,
108     majorid INT,
109     seat2 INT,
110     
111     PRIMARY KEY(id,stuname),#主键
112     UNIQUE(seat),#唯一键
113     CHECK(gender='' OR gender=''),#检查
114     FOREIGN KEY(majorid) REFERENCES major(id)#外键
115 );
116 SHOW INDEX FROM stuinfo;
117 
118 #通用的写法:
119 CREATE TABLE IF NOT EXISTS stuinfo(
120     id INT PRIMARY KEY,
121     stuname VARCHAR(20) NOT NULL UNIQUE,
122     sex CHAR(1),
123     age INT DEFAULT 18,
124     seat INT UNIQUE,
125     majorid INT,
126     CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
127 );
128 
129 #二、修改表时添加约束
130 /*
131 1、添加列级约束
132 alter table 表名 modify column 字段名 字段类型 新约束;
133 
134 2、添加表级约束
135 alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用】;
136 */
137 DROP TABLE IF EXISTS stuinfo;
138 CREATE TABLE stuinfo(
139     id INT,
140     stuname VARCHAR(20),
141     gender CHAR(1),
142     seat INT,
143     age INT,
144     majorid INT,
145     seat2 INT
146 );
147 SHOW INDEX FROM stuinfo;
148 DESC stuinfo;
149 #1.添加非空约束
150 ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NOT NULL;
151 #2.添加默认约束
152 ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;
153 #3.添加主键
154 #(1)列级约束
155 ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;
156 #(2)表级约束
157 ALTER TABLE stuinfo ADD PRIMARY KEY(id);
158 
159 #4.添加唯一
160 #(1)列级约束
161 ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;
162 #(2)表级约束
163 ALTER TABLE stuinfo ADD UNIQUE(seat);
164 
165 #5.添加外键
166 ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id);
167 ALTER TABLE stuinfo ADD CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);
168 
169 #三、修改表时删除约束
170 #1.删除非空约束
171 ALTER TABLE stuinfo MODIFY COLUMN stuname VARCHAR(20) NULL;
172 
173 #2.删除默认约束
174 ALTER TABLE stuinfo MODIFY COLUMN age INT;
175 
176 #3.删除主键
177 ALTER TABLE stuinfo DROP PRIMARY KEY;
178 
179 #4.删除唯一
180 ALTER TABLE stuinfo DROP INDEX seat;
181 
182 #5.删除外键
183 ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;
184 DESC stuinfo;
185 SHOW INDEX FROM stuinfo;
 1 #6.补充删除外键
 2 #传统的方式添加外键
 3 ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id);
 4 
 5 SELECT * FROM major;
 6 DELETE FROM major;
 7 INSERT INTO major
 8 VALUES(1,'java'),(2,'h5'),(3,'大数据');
 9 
10 SELECT * FROM stuinfo;
11 DELETE FROM stuinfo;
12 INSERT INTO stuinfo
13 SELECT 1,'jonh1','',NULL,NULL,1 UNION ALL
14 SELECT 2,'jonh2','',NULL,NULL,1 UNION ALL
15 SELECT 3,'jonh3','',NULL,NULL,2 UNION ALL
16 SELECT 4,'jonh4','',NULL,NULL,2 UNION ALL
17 SELECT 5,'jonh5','',NULL,NULL,1 UNION ALL
18 SELECT 6,'jonh6','',NULL,NULL,3 UNION ALL
19 SELECT 7,'jonh7','',NULL,NULL,3 UNION ALL
20 SELECT 8,'jonh8','',NULL,NULL,1;
21 
22 
23 #可以通过以下两种方式来删除主表的记录     
24 #方式一:级联删除
25 ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE CASCADE;
26 #删除专业表的3号专业
27 DELETE FROM major WHERE id =3;
28 
29 #方式二:级联置空
30 ALTER TABLE stuinfo ADD CONSTRAINT fk_stu_major FOREIGN KEY(majorid) REFERENCES major(id) ON DELETE SET NULL;
31 #删除专业表的2号专业
32 DELETE FROM major WHERE id =2;

 

posted @ 2020-07-28 14:56  意如柳  阅读(215)  评论(0编辑  收藏  举报