mysql建表约束
- 主键约束
- 主键约束-联合主键
- 建表后增加或删除或修改主键约束
- 自增约束
- 唯一约束
- 非空约束
- 默认约束
- 外键约束
主键约束
它能够唯一确定一张表中的一条记录,增加主键约束之后,就可以使得字段不重复而且不为空
目的:唯一确定一条记录
这里是引用
create table user(
id int PRIMARY KEY,
name VARCHAR(20)
);
INSERT INTO user VALUES (1,'张三');
此时,再插入一个张三的话,就会出现错误。
发现 id是不可以为null 而且 key的值 也变为:PRI(primary)
主键约束-联合主键
CREATE TABLE user2(
id INT,
name VARCHAR(20),
password VARCHAR(20),
PRIMARY key(id,name)
);
运行DESCRIBE user2;
INSERT INTO user2 VALUES (1,'老王','123456');
INSERT INTO user2 VALUES (2,'老王','123456');
总结:
说明了复合主键只要所有的字段都不是相同的情况下可以允许其中的字段重复:但其中字段不允许为空。
场景:
表中有班级号以及学生座位号,我们可以用班级号+学生的座位号可以准确的定位一个学生,如:(1班5号可以准确的确定一个学生)
建表后增加或删除或修改主键约束
增加:
alter table tablename add primary key(id);
删除:
alter table tablename drop primary key;
修改:
alter table tablename modify id int primary key;
自增约束
AUTO_INCREMENT可以在新记录插入表中时自动地创建唯一的数值(即进行自动增量),并且每个表只允许一个AUTO_INCREMENT列,而且它必须被索引(如通过使用AUTO_INCREMENT成为主键)。
注意:AUTO_INCREMENT 的默认开始值是 1,每条新记录自动递增 1。
CREATE TABLE user3(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
看表的描述:
INSERT INTO user3(name) VALUES('张三');
INSERT INTO user3(name) VALUES('李四');
这里可以发现,我们并没有去插入id值,但是由于自增约束,它自己产生了一个主键。
唯一约束
修饰的字段不可以重复。(可以多个字段联合添加唯一约束)
CREATE TABLE user4 (
id INT,
name VARCHAR(20),
UNIQUE(name)
);
-- 如果建表时没有设置唯一建,还可以通过SQL语句设置(两种方式):
ALTER TABLE user ADD UNIQUE(name);
ALTER TABLE user MODIFY name VARCHAR(20) UNIQUE;
-- 删除唯一主键
ALTER TABLE user DROP INDEX name;
测试:插入俩个相同的值,第二次插入失败!
`总结一下:
主键约束(primary key)中包含了唯一约束
场景:业务需求:设计一张用户注册表,用户姓名必须要用手机号来注册,而且手机号和用户名称都不能为空,那么:
CREATE TABLE user_test(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'主键id',
name VARCHAR(20) NOT NULL COMMENT'用户姓名,不能为空',
phone_number VARCHAR(20) UNIQUE NOT NULL COMMENT'用户手机,不能重复且不能为空'
);
运行 DESCRIBE user_test;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| phone_number | int(11) | NO | UNI | NULL | |
+--------------+-------------+------+-----+---------+----------------+
这样的话就达到了每一个手机号都只能出现一次,达到了每个手机号只能被注册一次.
用户姓名可以重复,但是手机号码却不能重复,复合正常的逻辑需求`
非空约束
修饰的字段不能为空。
create table user5(
id int ,
name varchar(20) not null
);
插入空值:就失败了。
默认约束
插入字段的时候,如果没有传值,就使用默认值!
-- 建表时添加默认约束
-- 约束某个字段的默认值
CREATE TABLE user6(
id int PRIMARY KEY AUTO_INCREMENT COMMENT'主键id',
name VARCHAR(20) NOT NULL COMMENT'用户姓名不能为空',
phone_number VARCHAR(20) NOT NULL COMMENT'用户手机号,不能为空',
status INT DEFAULT 0 COMMENT'用户状态0:启用 1:禁封 默认:0'
);
-- 移除非空约束
ALTER TABLE user MODIFY status INT;
在表的描述中,可以看到默认值为0。
应用场景:
业务需求:找正常的用户,对这些正常用户进行发放优惠卷或者积分之类的东西,而被禁封的用户我们不让其参加多动.
我们想要封用户只要将status的值从0改为1就行了,当然我们取用户的时候必须要先判断status是否是0.若是1.说明该用户已经被禁封.
先封手机号为'1234'的用户:
UPDATE user6 SET status = 1 WHERE phone_number= '1234';
SELECT * FROM user6;
+----+------+--------------+--------+
| id | name | phone_number | status |
+----+------+--------------+--------+
| 1 | aa | 123 | 0 |
| 2 | bb | 1234 | 1 |
| 3 | cc | 1263456 | 0 |
+----+------+--------------+--------+
status为1,说明用户已经被封,该用户不可以参加活动
我们取用户的时候加上status的判断,如:
SELECT * FROM user6 WHERE status = 0;
+----+------+--------------+--------+
| id | name | phone_number | status |
+----+------+--------------+--------+
| 1 | aa | 123 | 0 |
| 3 | cc | 1263456 | 0 |
+----+------+--------------+--------+
外键约束
涉及到俩个表:
父表,子表;
主表,副表。
1.主表中没有的数据值,在副表中,是不可以使用的;
2.主表中被副表引用,是不可以被删除的。
首先创建俩个表:
CREATE TABLE classes(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'班级表id',
name VARCHAR(20) COMMENT'班级名称'
);
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT COMMENT'学生表id',
name VARCHAR(20) COMMENT'学生姓名',
class_id int COMMENT'教室id,这张表中的class_id是classes表中id的值',
FOREIGN KEY (class_id) REFERENCES classes(id)
);
FOREIGN KEY (class_id) REFERENCES classes(id)
指明,class_id来自于父表种的id。
然后插入数据:
班级插入数据:
INSERT INTO CLASSES (name) VALUES ('一班');
INSERT INTO CLASSES (name) VALUES ('二班');
INSERT INTO CLASSES (name) VALUES ('三班');
INSERT INTO CLASSES (name) VALUES ('四班');
学生插入数据:
INSERT INTO student (name,class_id) VALUES ('小赵',1);
INSERT INTO student (name,class_id) VALUES ('小钱',2);
INSERT INTO student (name,class_id) VALUES ('小孙',3);
INSERT INTO student (name,class_id) VALUES ('小李',4);
这时候如果插入一个学生,但是class_id在父表中不存在。
就会发生报错!
删除正在被引用的四班,也会发生报错!
总结:
1.主表中没有的数据,在附表中,是不可以使用的.
2.主表中记录的数据现在正在被附表所引用,那么主表中正在被引用的数据不可以被删除
3.若要想删除,先将附表中的数据删除在删除主表数据
4.对于外键约束大家可以联想 省,市 来进行联想 (市必须要依赖于省,只要省还有一个市在引用,那么就不可以删除省,要不然市就没有省了. 那么我们想删除省,必须要将该省下所有的市全部删除之后,才可以删除这个省)