mysql建表约束

==主键约束(primary key)
它能够唯一确定一张表中的一条记录,也就是我们通过给某个字段添加约束,就可以使得修改字段不重复且不为空。
mysql> create table user(
id int primary key,
name varchar(20));
Query OK, 0 rows affected

mysql> insert
into user values(1,‘zhang’);
Query OK, 1 row affected

mysql> select *from user;
±—±------+
| id | name |
±—±------+
| 1 | zhang |
±—±------+
1 row in set

mysql> insert into user values(1,‘li’);
1062 - Duplicate entry ‘1’ for key ‘PRIMARY’

mysql> insert into user values(2,‘zhang’);
Query OK, 1 row affected
mysql> select *from user;
±—±------+
| id | name |
±—±------+
| 1 | zhang |
| 2 | zhang |
±—±------+
2 rows in set

mysql> insert into user values(NULL,‘zhang’);
1048 - Column ‘id’ cannot be null
==联合主键(只要联合的主键只要加起来不重复就可以)(例子中的id和name加起来不重复就行primary key(id,name))
mysql> create table user3(
id int,
name varchar(20),
password varchar(20),
primary key(id,name));
Query OK, 0 rows affected

insert into user3 values(1,‘zhang’,‘123’);

mysql> select *from user3;
±—±------±---------+
| id | name | password |
±—±------±---------+
| 1 | zhang | 123 |
±—±------±---------+
1 row in set

mysql> insert into user3 values(2,‘zhang’,‘123’);
Query OK, 1 row affected
联合主键的任何一个字段都不能为空(primary key(id,name) id和name都不能为空)
mysql> insert into user3 values(1,‘li’,‘123’);
Query OK, 1 row affected
==自增约束(auto_increment)
它会自动增长1、2、3…的东西
mysql> create table user4(
id int primary key auto_increment,
name varchar(20));
Query OK, 0 rows affected
mysql> insert into user4 (name) values (‘zhangsan’);
Query OK, 1 row affected
这里它自动生成id(自增约束和主键约束搭配在一起使用(primary key auto_increment)会帮我们去管控一个值如果我们再添加一个张三)
mysql> select * from user4;
±—±---------+
| id | name |
±—±---------+
| 1 | zhangsan |
±—±---------+
1 row in set
如果我们再添加一个张三(它会自动增长1、2、3…的东西)
mysql> insert into user4 (name) values (‘zhangsan’);
Query OK, 1 row affected
mysql> select*from user4;
±—±---------+
| id | name |
±—±---------+
| 1 | zhangsan |
| 2 | zhangsan |
±—±---------+
2 rows in set

==如何我们创建表的时候忘记创建主键约束了?改怎么办?
mysql> create table user5(
id int,
name varchar(20));
mysql> describe user5;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set

==修改表的结构,添加主键
mysql> alter table user5 add primary key(id);

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

==如何删除主键?
mysql> alter table user5 drop primary key;

mysql> describe user5;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | NO | | 0 | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set
==使用modify 修改字段,添加主键
alter table user5 modify id int primary key;

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

==唯一约束
==约束修饰的字段的值不可以重复
mysql> create table user6(
id int,
name varchar(20));
Query OK, 0 rows affected

==约束修饰name字段的值不可以重复
mysql> alter table user6 add unique(name);
Query OK, 0 rows affected

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

==这个UNI就是说name字段不能重复
mysql> insert into user6 values(1,‘zhangsan’);
Query OK, 1 row affected
mysql> insert into user6 values(1,‘zhangsan’);
1062 - Duplicate entry ‘zhangsan’ for key ‘name’
==name=‘lisi’
mysql> insert into user6 values(1,‘lisi’);
Query OK, 1 row affected

mysql> create table user7(
id int,
name varchar(20),
unique(name));
Query OK, 0 rows affected

mysql> create table user8(
id int,
name varchar(20)unique);
Query OK, 0 rows affected
==unique(id,name))表示俩个键加起来不重复就行
mysql> create table user9(
id int,
name varchar(20),
unique(id,name));
Query OK, 0 rows affected
mysql> describe user9;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | MUL | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set
==这个MUL就是说id,name字段加起来不能重复

==如何删除唯一约束?
mysql> alter table user8 drop index name;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
mysql> describe user8;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set

==modify 添加唯一约束?
mysql> alter table user8 modify name varchar(20) unique;
Query OK, 0 rows affected
Records: 0 Duplicates: 0 Warnings: 0
mysql> describe user8;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | UNI | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set

==总结:
1.建表的时候添加约束
2.建表的时候没有添加约束时,可以使用alter…add…
3…建表的时候没有添加约束时,可以使用alter…modify…
4.删除:alter…dorp…

==非空约束 not null
==修饰字段不能为空 NULL
mysql> create table user10(
id int,
name varchar(20) not null);
Query OK, 0 rows affected
mysql> describe user10;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | NO | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set

mysql> insert into user10 (id) values(1);
1364 - Field ‘name’ doesn’t have a default value

mysql> insert into user10 values(1,‘zhangsan’);
Query OK, 1 row affected

mysql> insert into user10(name) values(‘li’);
Query OK, 1 row affected

mysql> select*from user10;
±-----±---------+
| id | name |
±-----±---------+
| 1 | zhangsan |
| NULL | li |
±-----±---------+
2 rows in set

==默认约束
==就是当我们插入字段值的时候,如果没有传值,就会使用默认值
mysql> create table user11(
id int,
name varchar(20),
age int default 10);
Query OK, 0 rows affected
mysql> describe user11;
±------±------------±-----±----±--------±------+
| 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

mysql> create table user11(
id int,
name varchar(20),
age int default 10);
Query OK, 0 rows affected
mysql> describe user11;
±------±------------±-----±----±--------±------+
| 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

mysql> insert user11 (id,name) values(1,‘zhangsan’);
Query OK, 1 row affected
mysql> selectfrom user11;
±—±---------±----+
| id | name | age |
±—±---------±----+
| 1 | zhangsan | 10 |
±—±---------±----+
1 row in set
==如果传了值,就不会默认值
mysql> insert user11 values(1,‘zhangsan’,19);
Query OK, 1 row affected
mysql> select
from user11;
±—±---------±----+
| id | name | age |
±—±---------±----+
| 1 | zhangsan | 10 |
| 1 | zhangsan | 19 |
±—±---------±----+
2 rows in set

==外键约束
==涉及到俩个表:父表和子表
==主表,副表。
==假设有个班级表
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));

insert into classes values(1,‘1ban’);
insert into classes values(2,‘2ban’);
insert into classes values(3,‘3ban’);
insert into classes values(4,‘4ban’);

mysql> select*from classes;
±—±-----+
| id | name |
±—±-----+
| 1 | 1ban |
| 2 | 2ban |
| 3 | 3ban |
| 4 | 4ban |
±—±-----+
4 rows in set

insert into students values(1001,‘zhangsan’,1);
insert into students values(1002,‘zhangsan’,2);
insert into students values(1003,‘zhangsan’,3);
insert into students values(1004,‘zhangsan’,4);
==外键约束失败了,因为班级表是主表,学生表是副表,(班级表)主表里面没有5,所以在(学生表)副表中是不能使用的,所以insert into students values(1005,‘lisi’,5);会报错
mysql> insert into students values(1005,‘lisi’,5);
1452 - Cannot add or update a child row: a foreign key constraint fails (test2.students, CONSTRAINT students_ibfk_1 FOREIGN KEY (class_id) REFERENCES classes (id))
==1.主表(父表)classes 中没有的数据值,在副表(子表)中,是不可以使用的。
==2.主表中的记录被副表引用,(主表)是不可以被删除的。
mysql> delete from classes where id=4;
1451 - Cannot delete or update a parent row: a foreign key constraint fails (test2.students, CONSTRAINT students_ibfk_1 FOREIGN KEY (class_id) REFERENCES classes (id))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值