mysql数据类型与类型选择
MySQL 支持多种类型,大致可以分为三类:
-
数值
-
日期/时间
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
-
字符串(字符)类型。
字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。
数据类型如何选择?
日期 选择按照格式;
数字和字符串选择按照大小。
数据记录增删改查操作
增:
INSERT INTO pet VALUES('kk1','cc1','dog1','1','1998-1-2',null);
INSERT INTO pet VALUES('kk2','cc2','dog2','2','1998-2-2',null);
INSERT INTO pet VALUES('kk3','cc3','dog3','1','1998-3-2','1998-12-2');
INSERT INTO pet VALUES('kk4','cc4','dog4','2','1998-4-2',null);
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
| kk1 | cc1 | dog1 | 1 | 1998-01-02 | NULL |
| kk2 | cc2 | dog2 | 2 | 1998-02-02 | NULL |
| kk3 | cc3 | dog3 | 1 | 1998-03-02 | 1998-12-02 |
| kk4 | cc4 | dog4 | 2 | 1998-04-02 | NULL |
+----------+-------+---------+------+------------+------------+
删:
delete from pet where name='kk1';
+----------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+------------+
| Puffball | Diane | hamster | f | 1999-03-30 | NULL |
| kk2 | cc2 | dog2 | 2 | 1998-02-02 | NULL |
| kk3 | cc3 | dog3 | 1 | 1998-03-02 | 1998-12-02 |
| kk4 | cc4 | dog4 | 2 | 1998-04-02 | NULL |
+----------+-------+---------+------+------------+------------+
改:
update pet set name='changedkk2' where sex='f';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
查:
select * from pet;
+------------+-------+---------+------+------------+------------+
| name | owner | species | sex | birth | death |
+------------+-------+---------+------+------------+------------+
| changedkk2 | Diane | hamster | f | 1999-03-30 | NULL |
| kk2 | cc2 | dog2 | 2 | 1998-02-02 | NULL |
| kk3 | cc3 | dog3 | 1 | 1998-03-02 | 1998-12-02 |
| kk4 | cc4 | dog4 | 2 | 1998-04-02 | NULL |
+------------+-------+---------+------+------------+------------+
约束
主键约束和自增约束
主键约束
它能够唯一确定一张表中的一条记录,我们通过给某个字段添加约束,就可以使得该字段不重复并且不为空。
mysql> create table user(id int primary key,name varchar(20));
Query OK, 0 rows affected (0.05 sec)
mysql> insert into user values(1,‘张三’);
Query OK, 1 row affected (0.01 sec)
再一次插入张三:
mysql> insert into user values(1,‘张三’);
ERROR 1062 (23000): Duplicate entry ‘1’ for key ‘user.PRIMARY’
mysql> insert into user values(2,‘张三’);
Query OK, 1 row affected (0.00 sec)
mysql> insert into user values(null,‘张三’);
ERROR 1048 (23000): Column ‘id’ cannot be null
create table user2(
id int,
name varchar(20),
password varchar(20),
primary key (id,name)
);
可以对多个字段打上主键的标识“锁”,但这并不表示表拥有了多个主键,而是说这几个字段共同构成了主键。当然,他们之间也是有次序的。查看次序可以使用show index from table。
mysql> insert into user2 values(1,‘张三’,‘123’);
Query OK, 1 row affected (0.01 sec)
mysql> insert into user2 values(2,‘张三’,‘123’);
Query OK, 1 row affected (0.01 sec)
如果创建表的时候,忘记创建主键约束了,怎么修改?
create table user4(
id int,
name varchar(20)
);
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
alter table user4 add primary key(id);
±------±------------±-----±----±--------±------+
| Field | Type | Null | Key | Default | Extra |
±------±------------±-----±----±--------±------+
| id | int | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
±------±------------±-----±----±--------±------+
如何删除主键约束?
alter table user4 drop primary key;
如何修改主键约束?
alter table user4 modify id int primary key;
自增约束
(1)一个表只能有一个自增约束,因为一个表只有一个维护自增值的变量。
(2)自增约束的列只能是整数列
(3)自增约束的列必须是键列(主键,唯一键,外键),
create table user3(
id int primary key auto_increment,
name varchar(20)
);
mysql> insert into user3(name) values(‘张三’);
Query OK, 1 row affected (0.01 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)
);
insert into students values(1001,‘张三’,1);
insert into students values(1002,‘张三’,2);
insert into students values(1003,‘张三’,3);
insert into students values(1004,‘张三’,4);
insert into classes values(1,‘一班’);
insert into classes values(2,‘二班’);
insert into classes values(3,‘三班’);
insert into classes values(4,‘四班’);
注意
1、主表classes中没有的数据值(也就是id字段),在副表中(class_id字段),是不可以使用的。(也就是副表中class_id不能出现主表中没出现的id字段)。
insert into students(1005,‘王五’,5);(5这个class_id在主表中没有出现过)
2、主表中的数据被副表引用,是不可以删除的。
delete from classes where id=1;(副表中数据中有class_id为1的)
唯一约束
唯一约束与主键约束相似的是它们都可以确保列的唯一性。不同的是,唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但是只能有一个空值。而主键约束在一个表中只能有一个,且不允许有空值。比如,在用户信息表中,为了避免表中用户名重名,可以把用户名设置为唯一约束。
create table user5(
id int unique,
name varchar(20)
);
unique(id,name)表示两个键不同时重复就行
create table user6(
id int ,
name varchar(20),
unique(id,name)
);
drop删除约束
alter table user6 drop index id;
add 添加约束
alter table user6 add unique(id,name);
modify 添加约束
alter table user6 modify id int unique;
非空约束
修饰的字段不能为空 null
create table user7(
id int ,
name varchar(20) not null
);
默认约束
当我们插入字段值时,如果没有传值就会使用默认值。
create table user8(
id int,
name varchar(20),
age int default 10
);