mysql 数据类型
修改字段名称及类型
root@localhost [y36]>alter table student CHANGE c sex CHAR(5);
Query OK, 0 rows affected (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 0
整数类型
Type | 存储(字节) | 最小值 有符号 | 最小值 无符号 | 最大值 有符号 | 最大值 无符号 |
---|---|---|---|---|---|
TINYINT |
1 | -128 |
0 |
127 |
255 |
SMALLINT |
2 | -32768 |
0 |
32767 |
65535 |
MEDIUMINT |
3 | -8388608 |
0 |
8388607 |
16777215 |
INT |
4 | -2147483648 |
0 |
2147483647 |
4294967295 |
BIGINT |
8 | -263 |
0 |
263-1 |
264-1 |
案例: 根据数据类型
root@localhost [y36]>create table student(id int,name char(50),age int, sex char(5), SFID char(50), tel char(11));
root@localhost [y36]>desc student;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | char(50) | YES | | NULL | |
| age | int | YES | | NULL | |
| sex | char(5) | YES | | NULL | |
| SFID | char(50) | YES | | NULL | |
| tel | char(11) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
root@localhost [y36]>insert into student (id,name,age,sex,SFID,tel)values(1,'张三',10,'男','140427190000202020','18301002516');
Query OK, 1 row affected (0.01 sec)
root@localhost [(none)]>select * from y36.student;
+------+--------+------+------+--------------------+-------------+
| id | name | age | sex | SFID | tel |
+------+--------+------+------+--------------------+-------------+
| 1 | 张三 | 10 | 男 | 140427190000202020 | 18301002516 |
+------+--------+------+------+--------------------+-------------+
1 row in set (0.00 sec)
浮点数类型:
FLOAT
:单精度浮点数,适用于表示小数值。DOUBLE
:双精度浮点数,适用于表示更大或更精确的小数值。
字符串类型:
CHAR
:固定长度的字符,适用于存储定长字符串。VARCHAR
:可变长度的字符,适用于存储不定长字符串。TEXT
:用于存储较大文本数据的类型。
4. 日期和时间类型:
DATE:
用于存储日期,格式为YYYY-MM-DD。
TIME:
用于存储时间,格式为HH:MM:SS。
DATETIME:
用于存储日期和时间,格式为YYYY-MM-DD HH:MM:SS。
TIMESTAMP:
类似于DATETIME,但在写入时会自动更新为当前时间。
案例:
<font color=red>错误的语法</font>
root@localhost [(none)]>insert into y36.t1(t,dt,ts)values('1000-01-01','2022-12-14 11:44:00','2038-01-19 03:14:07.499999');
ERROR 1292 (22007): Incorrect time value: '1000-01-01' for column 't' at row 1
root@localhost [(none)]>insert into y36.t1(dt,ts)values('2022-12-14 11:44:00','2038-01-19 03:14:07.499999');
Query OK, 1 row affected (0.01 sec)
root@localhost [(none)]>insert into y36.t1(t,dt,ts)values('11:44:00','2022-12-14 11:44:00','2038-01-19 03:14:07.499999');
Query OK, 1 row affected (0.03 sec)
root@localhost [(none)]>insert into y36.t1(t,dt,ts)values('11:44:00','2022-12-14 11:44:00','2038-01-19 03:14:07.499999');^C
root@localhost [(none)]>select * from y36.t1;
+--------------+----------------------------+---------------------+
| t | dt | ts |
+--------------+----------------------------+---------------------+
| NULL | 2022-12-14 11:44:00.000000 | 2038-01-19 03:14:07 |
| 11:44:00.000 | 2022-12-14 11:44:00.000000 | 2038-01-19 03:14:07 |
+--------------+----------------------------+---------------------+
案例2: 在原有的表中添加日期时间的字段
# 修改表的的字段(添加一个字段)
root@localhost [(none)]>alter table y36.student add dt DATETIME;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 更新表里的数据
root@localhost [(none)]>update y36.student set dt='2023-12-14 12:02:20' where id=1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
# 验证
root@localhost [(none)]>select * from y36.student;
+------+--------+------+------+--------------------+-------------+---------------------+
| id | name | age | sex | SFID | tel | dt |
+------+--------+------+------+--------------------+-------------+---------------------+
| 1 | 张三 | 10 | 男 | 140427190000202020 | 18301002516 | 2023-12-14 12:02:20 |
+------+--------+------+------+--------------------+-------------+---------------------+
1 row in set (0.00 sec)
获取当前
root@localhost [y36]>desc t1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| t | time(3) | YES | | NULL | |
| dt | datetime(6) | YES | | NULL | |
| ts | timestamp | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
root@localhost [y36]>insert into t1(t,dt,ts)values(CURTiME(),NOW(),CURDATE());
Query OK, 1 row affected (0.01 sec)
root@localhost [y36]>select * from t1;
+--------------+----------------------------+---------------------+
| t | dt | ts |
+--------------+----------------------------+---------------------+
| NULL | 2022-12-14 11:44:00.000000 | 2038-01-19 03:14:07 |
| 11:44:00.000 | 2022-12-14 11:44:00.000000 | 2038-01-19 03:14:07 |
| 14:35:38.000 | 2023-12-14 14:35:38.000000 | 2023-12-14 00:00:00 |
+--------------+----------------------------+---------------------+
3 rows in set (0.01 sec)
回顾:
SQL 的基础语法
创建表
插入表中的数据类型
- 数字类型
- 整数类型
- int()
- 浮点数类型
- float()
- double()
- 整数类型
- 字符类型 (String type)
- char() 类型
- varchar()
- text
- 时间类型
- time
- date
- datetime
- timestamp
条件约束
数据完整性约束用于确保数据库中数据的合法性和一致性,防止不符合预期的数据被插入或修改。以下是常见的数据完整性约束:
NOT NULL:
NOT NULL
约束用于确保列中的值不能为空值(NULL)。- 这意味着在插入或更新数据时,必须为该列提供一个非空值,否则会抛出错误。
- 示例:
name VARCHAR(50) NOT NULL
表示name
列不能包含空值。
UNIQUE:
UNIQUE
约束用于确保列中的值是唯一的,即不允许有重复的值。- 可以在一个或多个列上创建
UNIQUE
约束。 - 示例:
email VARCHAR(100) UNIQUE
表示email
列中的值必须是唯一的,不能有重复的电子邮件地址。
PRIMARY KEY:
PRIMARY KEY
约束用于定义表中的主键,确保每一行数据都有唯一的标识。- 一个表只能有一个主键,主键可以由一个或多个列组成。
- 示例:
student_id INT PRIMARY KEY
表示student_id
列是主键,用于唯一标识每个学生。
FOREIGN KEY:
FOREIGN KEY
约束用于建立表之间的关联,确保一个表的数据与另一个表的数据保持一致。- 外键引用另一个表的主键,用于建立父表和子表之间的关系。
- 示例:
course_id INT, FOREIGN KEY (course_id) REFERENCES Courses(course_id)
表示course_id
列是外键,引用了Courses
表的主键course_id
。
CHECK:
CHECK
约束用于限制列中的值必须满足指定的条件。- 可以使用表达式来定义 CHECK 约束,如果表达式为假,则不允许插入或更新数据。
- 示例:
age INT CHECK (age >= 0)
表示age
列的值必须大于等于0。
案例:不能为空值
create table y36.class2(id int not null, name char(20) not null, age int(3) not null, sex char(2) not null, SFid char(20) not null, tel char(11) not null, )
root@localhost [(none)]>desc y36.class2;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int | NO | | NULL | |
| name | char(20) | NO | | NULL | |
| age | int | NO | | NULL | |
| sex | char(2) | NO | | NULL | |
| SFid | char(20) | NO | | NULL | |
| tel | char(11) | NO | | NULL | |
+-------+----------+------+-----+---------+-------+
6 rows in set (0.01 sec)
案例2: 用户不需要输入ID
ID 列设置为自增
root@localhost [(none)]>CREATE TABLE y36.class3(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
NAME CHAR(20) NOT NULL,
age INT(3) NOT NULL,
sex CHAR(2) NOT NULL,
SFid CHAR(20) NOT NULL,
tel CHAR(11) NOT NULL
);
# 插入数据
root@localhost [(none)]>insert into y36.class3(name,age,sex,SFid,tel)values('lisi',18,'m','14041900024100111','18301002516');
Query OK, 1 row affected (0.02 sec)
root@localhost [(none)]>insert into y36.class3(name,age,sex,SFid,tel)values('lisi',18,'m','14041900024100111','18301002516');
Query OK, 1 row affected (0.01 sec)
root@localhost [(none)]>insert into y36.class3(name,age,sex,SFid,tel)values('lisi',18,'m','14041900024100111','18301002516');
Query OK, 1 row affected (0.01 sec)
root@localhost [(none)]>insert into y36.class3(name,age,sex,SFid,tel)values('lisi',18,'m','14041900024100111','18301002516');
Query OK, 1 row affected (0.01 sec)
root@localhost [(none)]>insert into y36.class3(name,age,sex,SFid,tel)values('lisi',18,'m','14041900024100111','18301002516');
Query OK, 1 row affected (0.01 sec)
root@localhost [(none)]>insert into y36.class3(name,age,sex,SFid,tel)values('lisi',18,'m','14041900024100111','18301002516');
Query OK, 1 row affected (0.01 sec)
root@localhost [(none)]>insert into y36.class3(name,age,sex,SFid,tel)values('lisi',18,'m','14041900024100111','18301002516');
Query OK, 1 row affected (0.01 sec)
root@localhost [(none)]>insert into y36.class3(name,age,sex,SFid,tel)values('lisi',18,'m','14041900024100111','18301002516');
Query OK, 1 row affected (0.01 sec)
案例2: SFid 不能出现重复
# 修改表中SFid字段的属性
root@localhost [(none)]>alter table y36.class3 modify column SFid char(20) not null UNIQUE;
Query OK, 0 rows affected (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 0
# 查看表的格式
root@localhost [(none)]>desc y36.class3
-> ;
+----------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | char(20) | NO | | NULL | |
| age | int | NO | | NULL | |
| sex | char(2) | NO | | NULL | |
| SFid | char(20) | YES | UNI | NULL | |
| tel | char(11) | NO | | NULL | |
| datetime | datetime | YES | | NULL | |
+----------+----------+------+-----+---------+----------------+
7 rows in set (0.01 sec)
root@localhost [(none)]>insert into y36.class3(name,age,sex,SFid,tel)values('lisi',18,'m','14041900024100111','18301002516');
Query OK, 1 row affected (0.82 sec)
设置条件
总结
创建表的属性及约束条件
一、data_type
data_type表示列定义中的数据类型。有关可用于指定列数据类型的语法的完整描述,以及有关每种类型属性的信息
二、NOT NULL | NULL
如果既没有指定NULL也没有指定NOT NULL,则该列将被视为已指定NULL。
三、 AUTO_INCREMENT 自增
整数或浮点列可以具有附加属性AUTO_INCREMENT。当您在索引的AUTO_INCREMENT列中插入NULL(推荐)或0的值时,该列将设置为下一个序列值。通常这是value+1,其中value是当前表中列的最大值。AUTO_INCREMENT序列以1开头
四、主键 PRIMARY KEY
一个唯一的索引,其中所有键列都必须定义为NOT NULL。如果它们没有被明确声明为NOT NULL,MySQL会隐式(和无声地)声明它们。一张桌子只能有一个PRIMARY KEY。PRIMARY KEY的名称始终为主PRIMARY,因此不能用作任何其他类型索引的名称。
如果您没有PRIMARY KEY,并且应用程序在表中要求输入主PRIMARY KEY,MySQL将返回第一个具有noNULL列作为PRIMARY KEY的UNIQUE索引
五、UNIQUE(字段中不能出现重复字段)
UNIQUE索引创建一个约束,使得索引中的所有值都必须是不同的。如果您尝试添加具有与现有行匹配的键值的新行,则会出现错误。对于所有引擎,UNIQUE索引允许为可能包含NULL的列提供多个NULL值。
六、外键(FOREIGN KEY)
- 外键用于建立表之间的关系,它引用另一个表的主键,将两个表关联起来。
- 外键通常位于一个表中,指向另一个表中的主键列,用于建立数据之间的关联。
- 外键的作用是维护数据表之间的引用完整性,确保引用的数据存在于关联的表中。
- 当在父表中插入、更新或删除记录时,外键可用于自动处理相关联的子表的操作,以保持数据一致性。
七、索引(Index):
- 索引用于加快数据库查询操作,通过创建一个特定列或列组的快速访问结构,从而提高查询性能。
- 索引允许数据库更快地找到满足特定条件的行,而不需要扫描整个表。
- 索引可以单独创建,也可以在表的创建过程中定义。
- 尽管索引提高了查询速度,但同时也会增加写入操作的开销,因为每次插入、更新或删除数据时,都需要维护索引的正确性。
主键 外键和索引
案例:
create database y37;
CREATE TABLE y37.student (
id INT NOT NULL,
PRIMARY KEY (id)
);
create table y37.stu_info(
id INT,
student_id INT,
INDEX stude_id (student_id),
FOREIGN KEY (student_id)
REFERENCES student(id)
ON DELETE CASCADE
);