秋招C++开发学习之路day29

day2
mysql建表约束

主键约束
他能够唯一确定一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得该字段不重复且不为空。

给id加上了 primary key;

mysql> create table user(
-> id int primary key,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.76 sec)

mysql> show tables;
±---------------+
| Tables_in_test |
±---------------+
| pet |
| tsettype |
| user |
±---------------+
3 rows in set (0.00 sec)

mysql> describe user;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.03 sec)
PRI 就是主键约束

因为设置了主键约束,所以再插入1,张三 时,就会报错:

mysql> insert into user values(1,‘张三’);
Query OK, 1 row affected (0.15 sec)

mysql> insert into user values(1,‘张三’);
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘PRIMARY’
改成2 就可以插入了。
mysql> insert into user values(2,‘张三’);
Query OK, 1 row affected (0.09 sec)
现在的id也不能为空!!

对两个进行主键约束:
联合主键:只要两个主键值加起来不重复就可以!! 但是都不能为空!
mysql> create table user2(
-> id int,
-> name varchar(20),
-> password varchar(20),
-> primary key(id,name)
-> );
Query OK, 0 rows affected (0.32 sec)

mysql> insert into user2 values(1,‘张三’,‘123’);
Query OK, 1 row affected (0.06 sec)

mysql> insert into user2 values(2,‘张三’,‘123’);
Query OK, 1 row affected (0.12 sec)

mysql> insert into user2 values(2,‘李四’,‘123’);
Query OK, 1 row affected (0.07 sec)

mysql> select *from user2;
±—±-------±---------+
| id | name | password |
±—±-------±---------+
| 1 | 张三 | 123 |
| 2 | 张三 | 123 |
| 2 | 李四 | 123 |
±—±-------±---------+
3 rows in set (0.00 sec)

自增约束,自动添加有约束的主键(auto_increment)
mysql> create table user3(
-> id int primary key auto_increment,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.29 sec)

mysql> insert into user3(name) values(‘张三’);
Query OK, 1 row affected (0.05 sec)

mysql> select *from user3;
±—±-------+
| id | name |
±—±-------+
| 1 | 张三 |
±—±-------+
1 row in set (0.00 sec)

mysql> insert into user3(name) values(‘张三’);
Query OK, 1 row affected (0.09 sec)

mysql> select *from user3;
±—±-------+
| id | name |
±—±-------+
| 1 | 张三 |
| 2 | 张三 |
±—±-------+

如果我们创建表的时候忘记创建主键约束了,怎么办?
mysql> create table user4(
-> id int,
-> name varchar(20));
Query OK, 0 rows affected (0.38 sec)

mysql> desc user3;
±------±------------±-----±----±--------±---------------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±---------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±---------------+
2 rows in set (0.00 sec)

mysql> desc user4;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)

在创建表之后加入主键约束:
mysql> alter table user4 add primary key(id);
Query OK, 0 rows affected (0.97 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user4;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.01 sec)

–删除表主键约束:
mysql> alter table user4 drop primary key;
Query OK, 0 rows affected (0.91 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user4;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | NO | | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)

另种方式添加主键约束:要加上定义的类型!!
mysql> alter table user4 modify id int primary key;
Query OK, 0 rows affected (0.62 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc user4;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+

唯一约束
约束修饰的字段的值不可以重复
create table user5(
-> id int,
-> name varchar(20));

mysql> alter table user5 add unique(name);
mysql> desc user5;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.04 sec)

也可以在创建表时候直接添加:
mysql> create table user6(
-> id int,
-> name varchar(20),
-> unique(name)
-> );
Query OK, 0 rows affected (0.60 sec)

mysql> desc user6;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
±------±------------±-----±----±--------±------+

写在后面也可以:
name varchar(20) unique

同时添加两个unique:UNI变成MUL
mysql> create table user8(
-> id int,
-> name varchar(20),
-> unique(id,name)(表示两个组合在一起不重复就行)类似联合主键
-> );
Query OK, 0 rows affected (0.45 sec)

mysql> desc user8;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | MUL | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+

删除唯一约束:
mysql> alter table user7 drop index name;
删除掉了 name上的唯一约束
mysql> desc user7;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)

用modify添加唯一约束:
mysql> alter table user7 modify name varchar(20) unique;(必须加上定义的类型)

总结:
建表的时候添加约束
可以使用alter…add…
alter…modify

删除:alter…drop。。。

day3
非空约束:修饰字段不能为空 NILL
mysql> create table user9(
-> id int,
-> name varchar(20)not null
-> );
mysql> desc user9;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | NO | | NULL | |
±------±------------±-----±----±--------±------+
可以看出 Null这一栏,id 可以为NULL,name不能!

mysql> insert into user9 (id)values(1);
ERROR 1364 (HY000): Field ‘name’ doesn’t have a default value
因为name没有值,所以报错!

只添加name时就可以,因为id可以为NULL。
mysql> insert into user9 (name)values(‘lisi’);
Query OK, 1 row affected (0.10 sec)
mysql> select *from user9;
±-----±-------+
| id | name |
±-----±-------+
| 1 | 张三 |
| NULL | lisi |
±-----±-------+

默认约束
就是我们插入字段值的时候,如果没有值,就会使用默认值。

mysql> create table user10(
-> id int,
-> name varchar(20),
-> age int default 10);
Query OK, 0 rows affected (0.35 sec)

mysql> desc user10;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| age | int(11) | YES | | 10 | |
±------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)

虽然没有插入age的数据,但是有设置默认值!
mysql> insert into user10 (id,name) values(1,‘张三’);
Query OK, 1 row affected (0.05 sec)

mysql> select *from user10;
±-----±-------±-----+
| id | name | age |
±-----±-------±-----+
| 1 | 张三 | 10 |
±-----±-------±-----+

比较复杂的:外键约束
涉及到两个表:父表、子表,或者说 主表、副表

班级表:
学生表:
有关联性的,学生表的class_id来自classes表中的id!
mysql> create table classes(
-> id int primary key,
-> name varchar(20)
-> );
mysql> create table students(
-> id int primary key,
-> name varchar(20),
-> class_id int,
-> foreign key(class_id) references classes(id)
-> );

mysql> desc classes;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |

mysql> desc students;
±---------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±------------±-----±----±--------±------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| class_id | int(11) | YES | MUL | NULL | |
±---------±------------±-----±----±--------±------+
插入数据
mysql> select *from classes;
±—±-------+
| id | name |
±—±-------+
| 1 | 一ban |
| 2 | 2ban |
| 3 | 3ban |
| 4 | 4ban |
±—±-------+
mysql> insert into students values(1003,‘zhangsan’,3);
Query OK, 1 row affected (0.09 sec)
因为关联了classes的id,所以插入class_id为5时,classes没有id=5的,所以会报错!
mysql> insert into students values(1005,‘zhangsan’,5);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (test.students, CONSTRAINT students_ibfk_1 FOREIGN KEY (class_id) REFERENCES classes (id))

  1. 主表classes中没有的数据值,在副表中不可以使用
  2. 主表中的记录被副表引用时,是不能删除的。但是可以删除没有被引用的值的项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值