mysql建表约束

1. 主键约束

它能够确定一张表中的一条记录,通过给某个字段添加约束,就可以使得字段
不重复且不为空。

create table user(
	id int primary key,
	name varchar(20)
);

insert into user values(1, '张三');
insert into user values(2, '张三');
insert into user values(null, '张三'); --会失败,不可为空。

联合主键:
联合的主键值加起来不重复即可。

create table user2(
    id int,
    name varchar(20),
    password varchar(20),
    primary key(id,name)
);
describe user2;--输出如下:
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | NO   | PRI | NULL    |       |
| name     | varchar(20) | NO   | PRI | NULL    |       |
| password | varchar(20) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+

insert into user2 values(1, '张三','123');
insert into user2 values(2, '张三','123');
insert into user2 values(1, '三','123');

select * from user2;
+----+--------+----------+
| id | name   | password |
+----+--------+----------+
|  1 || 123      |
|  1 | 张三   | 123      |
|  2 | 张三   | 123      |
+----+--------+----------+

2. 自增约束

与主键约束组合,管控主键的值,自动增加序号,方便使用。

create table user3(
    id int primary key auto_increment,
    name varchar(20)
);

mysql> insert into user3(name) values('zhansna');
mysql> insert into user3(name) values('zhansna');
mysql> insert into user3(name) values('zhansna');

mysql> select * from user3;
+----+---------+
| id | name    |
+----+---------+
|  1 | zhansna |
|  2 | zhansna |
|  3 | zhansna |
+----+---------+

创建表的时候,忘记创建主键约束。

create table user4(
    id int,
    name varchar(20)
);

修改表结构,添加主键。

alter table user4 add primary key(id);
describe user4;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

使用modify修改字端,添加约束。

alter table user4 modify id int primary key;
describe user4;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

删除主键;

alter table user4 drop primary key;

3. 唯一约束

约束修饰的字段值不可以重复

create table user5(
    id int,
    name varchar(20)
);

alter table user5 add unique(name);
describe user5;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(20) | YES  | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+

或者

create table user5(
    id int,
    name varchar(20),
    unique(name)
);

或者

create table user5(
    id int,
    name varchar(20) unique
);

删除唯一约束drop

alter table user5 drop index name;

添加唯一约束modify

alter table user5 modify name varchar(20) unique;

总结:
—(1. 建表的时候添加约束
—(2 后期使用alter …add…
—(3 后期使用alter…modify…

—(4 删除约束alter…drop…

4. 非空约束

修饰的字段不能为空。

create table user9(
    id int,
    name varchar(20) not null
);

insert into user9 values(1, 'zhangsan');
insert into user9(name) values('lisi');

describe user9;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(20) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

select * from user9;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
| NULL | lisi     |
+------+----------+

5. 默认约束

插入字段时,如果没有传值,就会使用默认值。

create table user10(
    id int,
    name varchar(20),
    age int default 10
);

insert into user10(id, name) values(1, 'zhangsan');

有输入,则代替默认值

insert into user10 values(1, 'zhangsan', 11);

 select * from user10;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   10 |
|    1 | zhangsan |   11 |
+------+----------+------+

6. 外键约束

涉及到两个表,主表,副表。

班级:主表(删除表:DROP TABLE table_name;)

create table classes(
    id int primary key,
    name varchar(20)
);

 describe classes;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

学生:副表

create table students(
    id int primary key,
	name varchar(20),
    class_id int,
	foreign key(class_id) references classes(id)
);
describe students;

+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | NO   | PRI | NULL    |       |
| name     | varchar(20) | YES  |     | NULL    |       |
| class_id | int         | YES  | MUL | NULL    |       |
+----------+-------------+------+-----+---------+-------+

插入数据到classes中:

insert into classes values(1,'一般');
insert into classes values(2,'二般');
insert into classes values(3,'三般');
insert into classes values(4,'四般');
select * from classes;
+----+--------+
| id | name   |
+----+--------+
|  1 | 一般   |
|  2 | 二般   |
|  3 | 三般   |
|  4 | 四般   |
+----+--------+

插入数据到students中:

insert into students values(1001,'章三', 1);
insert into students values(1002,'里斯', 2);
insert into students values(1003,'王武', 3);
insert into students values(1004,'找刘', 4);
select * from students;
+------+--------+----------+
| id   | name   | class_id |
+------+--------+----------+
| 1001 | 章三   |        1 |
| 1002 | 里斯   |        2 |
| 1003 | 王武   |        3 |
| 1004 | 找刘   |        4 |
+------+--------+----------+
insert into students values(1005,'拿吧',5);
ERROR 1452 (23000): Cannot add or update a child row: 
a foreign key constraint fails (`pet`.`students`, CONSTRAINT 
	`students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes`
	 (`id`))

错误原因:

  1. 要是主表中没有的数据值,副表中不可以使用。
delete from classes where id=4;
ERROR 1451 (23000): Cannot delete or update a parent row: 
a foreign key constraint fails (`pet`.`students`, CONSTRAINT 
	`students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` 
	`id`))

错误原因:
2. 主表记录被副表使用,则不可以删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值