MySQL建表约束

————主键约束

create table user(
id int primary key,
name varchar(20)
);//将id设置为主键约束
——添加第一条数据,id=1;
mysql> insert into user values(1,‘张三’);
Query OK, 1 row affected (0.01 sec)
——再次添加id为1的数据
mysql> insert into user values(1,‘张三’);
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘user.PRIMARY’
——添加第二条数据,id=2
mysql> insert into user values(2,‘李四’);
Query OK, 1 row affected (0.01 sec)
//查询
mysql> select * from user;
±—±-------+
| id | name |
±—±-------+
| 1 | 张三 |
| 2 | 李四 |
±—±-------+
2 rows in set (0.00 sec)
注意:主键约束的数据不为空。

———联合主键约束(只要主键值不完全重复即可添加数据)
create table user2(
id int ,
name varchar(20),
password varchar(20),
primary key(id,name)
);
mysql> insert into user2 values(1,‘zhangsan’,‘234’);
Query OK, 1 row affected (0.01 sec)
mysql> insert into user2 values(2,‘zhangsan’,‘234’);
Query OK, 1 row affected (0.01 sec)
mysql> insert into user2 values(2,‘李四’,‘2345’);
Query OK, 1 row affected (0.00 sec)

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

————自增约束(自动增加约束键值)
——auto_increment

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

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

mysql> insert into user3 (name) values(‘zhangsan’);
Query OK, 1 row affected (0.01 sec)
mysql> select *from user3;
±—±---------+
| id | name |
±—±---------+
| 1 | zhangsan |
±—±---------+
1 row in set (0.00 sec)

mysql> insert into user3 (name) values(‘zhangsan’);
Query OK, 1 row affected (0.01 sec)

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

——如果建表时忘记创建主键约束,该怎么办?
create table user4(
id int,
name varchar(20)
);

mysql> desc user4;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int | 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.06 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user4;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)
——如何删除主键约束
alter table user4 drop primary key;

mysql> alter table user4 drop primary key;
Query OK, 0 rows affected (0.07 sec)
Records: 0 Duplicates: 0 Warnings: 0

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

——修改当前主键约束(通过modify修改字段的方式)
alter table user4 modify id int primary key ;

mysql> alter table user4 modify id int primary key ;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0

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

————唯一约束
——约束修饰的字段的值不能重复
方法1
create table user5(
id int,
name varchar(20)
);
alter table user5 add unique(name);

mysql> alter table user5 add unique(name);
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> insert into user5 values(1,‘zhangsan’);
ERROR 1062 (23000): Duplicate entry ‘zhangsan’ for key ‘user5.name’ //唯一约束的名称重复,生成错误

mysql> insert into user5 values(1,‘lisi’);
Query OK, 1 row affected (0.01 sec)

mysql> select *from user5;
±-----±---------+
| id | name |
±-----±---------+
| 1 | zhangsan |
| 1 | lisi |
±-----±---------+
2 rows in set (0.00 sec)

方法2.
create table user6(
id int,
name varchar(20),
unique(name)
);

方法3.
create table user7(
id int,
name varchar(20) unique
);
方法4.(联合唯一约束):键值不同时重复即可
create table user8(
id int,
name varchar(20),
unique(id,name)
);

——如何删除唯一约束
alter table user7 drop index name;
mysql> alter table user7 drop index name;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> desc user7;
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)
——通过modify的形式添加
alter table user7 modify name varchar(20) unique;

mysql> alter table user7 modify name varchar(20) unique;
Query OK, 0 rows affected, 1 warning (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 1

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

总结
——建表的时候就添加约束
——建表之后可以使用alter … add…
——也可以使用alter…modify…修改字段的方式
——删除使用 alter … drop …

————非空约束
修饰字段不能为空 NULL
create table user9(
id int,
name varchar(20) not null
);
/*
mysql> insert into user9 values(1);
ERROR 1136 (21S01): Column count doesn’t match value count at row 1
*/
mysql> insert into user9 values(1,‘zhangsan’);
Query OK, 1 row affected (0.01 sec)
mysql> insert into user9 values(NULL,‘lisi’);
Query OK, 1 row affected (0.01 sec)
mysql> select from user9;
±-----±---------+
| id | name |
±-----±---------+
| 1 | zhangsan |
| NULL | lisi |
±-----±---------+
2 rows in set (0.01 sec)
————默认约束
/
当我们在插入字段值时,如果没有传值,就会使用默认值 */
create table user10(
id int,
name varchar(20),
age int default 10
);

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

Query OK, 0 rows affected (0.04 sec)

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

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

mysql> select* from user10
-> ;
±-----±---------±-----+
| id | name | age |
±-----±---------±-----+
| 1 | zhangsan | 10 |
±-----±---------±-----+
1 row in set (0.00 sec)

insert into user10 values(2,‘lisi’,19);

mysql> select* from user10;
±-----±---------±-----+
| id | name | age |
±-----±---------±-----+
| 1 | zhangsan | 10 |
| 2 | lisi | 19 |
±-----±---------±-----+
2 rows in set (0.00 sec)
————外键约束

——涉及到两个表:一个父表一个子表
——班级
create table classes(
id int primary key,
name varchar(20)
);

——学生
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 | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
2 rows in set (0.00 sec)

mysql> desc students
-> ;
±---------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±---------±------------±-----±----±--------±------+
| id | int | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
| class_id | int | YES | MUL | NULL | |
±---------±------------±-----±----±--------±------+
3 rows in set (0.00 sec)
/插入数据/
insert into students values(1001,‘张三’,1);
insert into students values(1002,‘张三’,2);
insert into students values(1003,‘张三’,3);
insert into students values(1004,‘张三’,4);
mysql> select *from students;
±-----±-------±---------+
| id | name | class_id |
±-----±-------±---------+
| 1001 | 张三 | 1 |
| 1002 | 张三 | 2 |
| 1003 | 张三 | 3 |
| 1004 | 张三 | 4 |
±-----±-------±---------+
4 rows in set (0.00 sec)

insert into classes  values(1,'一班');
insert into classes  values(2,'二班');
insert into classes  values(3,'三班');
insert into classes  values(4,'四班');
mysql> select *from classes;

±—±-------+
| id | name |
±—±-------+
| 1 | 一班 |
| 2 | 二班 |
| 3 | 三班 |
| 4 | 四班 |
±—±-------+
4 rows in set (0.00 sec)

/*
——主表(父表)classes中没有的数据值(相关联的项),在副表(子表)中不能够被使用
——主表的记录被附表引用是不可以被删除的
*/
mysql> insert into students values(1004,‘张三’,6);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘,6)’ at line 1
mysql> insert into students values(1004,‘张三’,2);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘,2)’ at line 1

mysql> delete from classes where id =4;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (test.students, CONSTRAINT students_ibfk_1 FOREIGN KEY (class_id) REFERENCES classes (id))
mysql>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值