数据库中表的操作
创建表:create table + 表名
mysql> create table student(
-> id int(10),
-> name varchar(20),
-> age int(5),
-> primary key(id)
-> );
Query OK, 0 rows affected (0.10 sec)
约束
- 约束是表级的强制规定,约束放置在表中删除有关联关系的数据,对数据库中表的字段的值加的一些限制和保护,是对数据保护的最后一道屏障。
- 约束条件与数据类型的宽度一样,都是可选参数。
- 作用:用于保证数据的完整性和一致性。
五种约束:
- PRIMARY KEY (PK) :标识该字段为该表的主键,可以唯一的标识记录。
- FOREIGN KEY (FK) :标识该字段为该表的外键。
- NOT NULL :标识该字段不能为空。
- UNIQUE KEY (UK) :标识该字段的值是唯一的。
- AUTO_INCREMENT :标识该字段的值自动增长(整数类型,而且为主键)。
- DEFAULT :为该字段设置默认值。
- UNSIGNED :无符号。
- ZEROFILL :使用0填充。
【是否允许为空,默认为NULL,可设置NOT NULL;若字段不允许为空,必须赋值】
【字段是否有默认值,缺省的默认值是NULL,若插入记录时不给字段赋值,此字段使用默认值】
非空约束
- 保证列值不能为空;只能定义在列级。
- 在创建表的时候设置非空约束。
mysql> create table test1(
-> id int(10),
-> name varchar(20) not null
-> );
Query OK, 0 rows affected (0.11 sec)
主键约束
- 一张表只能有一个主键约束,主键约束可以由多个字段构成(联合主键和复合主键)。
- 如果对表中某个字段加主键约束,则这个字段非空并且唯一。
- 在创建表的时候设置主键。
修改表结构增加主键:alter table 表名 add constraint [主键名称] primary key (主键字段)
mysql> create table test2(
-> id int(5) primary key,
-> name varchar(15)
-> );
Query OK, 0 rows affected (0.03 sec)
唯一约束
- 设置字段值的唯一性(不可重复)。
- 唯一约束和主键约束的区别:主键字段值必须是非空的。
- 唯一约束允许有空值(只能出现一个),唯一约束允许有多个,主键约束每张表只能有一个。
- 在创建表的时候设置唯一约束 Unique 。
mysql> create table test3(
-> id int(5) primary key,
-> name varchar(20) unique,
-> phone int(11) unique
-> );
Query OK, 0 rows affected (0.08 sec)
外键约束(主从表)
- CONSTRAINT 外键名称 FOREIGN KEY(字段) REFERENCES 外键依赖表名(依赖表中的相应字段)
- ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(本表的外键字段) REFERENCES 外键依赖表名(依赖表中的相应字段)
以学生信息表和班级表为例,class表中的sid为外键,student表中的id为主键,sid依赖于id,使两个表相关联。
mysql> create table student(
-> id int(10) primary key,
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> create table class(
-> class_id int(5) primary key,
-> class_name varchar(10),
-> sid int(10),
-> constraint fk_stu_sid foreign key(sid) references student(id)
-> );
Query OK, 0 rows affected (0.02 sec)
mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(10) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> desc class;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| class_id | int(5) | NO | PRI | NULL | |
| class_name | varchar(10) | YES | | NULL | |
| sid | int(10) | YES | MUL | NULL | |
+------------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
自动增长列
对于一些主键约束的字段(如 id),一般从1开始插入,不断增加,添加数据时比较繁琐,每次都添加一个id字段值,容易出错。可以将id字段设置为自动增加,使用 AUTO_INCREMENT 关键字设置表字段值自动增加。
- 将已经创建完成的表字段设置为自动增长列:
- ALTER TABLE 表名 MODIFY 字段名 数据类型 PRIMARY KEY AUTO_INCREMENT;
mysql> create table test4(
-> id int(5) primary key auto_increment,
-> name varchar(20) not null,
-> sex varchar(5)
-> );
Query OK, 0 rows affected (0.11 sec)
修改表:
添加新字段:
alter table 表名 add 新字段名 新字段类型
mysql> desc test4;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(5) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| sex | varchar(5) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> alter table test4 add phone int(11);
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc test4;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(5) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| sex | varchar(5) | YES | | NULL | |
| phone | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
修改字段(重命名)
alter table 表名 change 原名 新名 类型及约束;
mysql> desc test4;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(5) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| sex | varchar(5) | YES | | NULL | |
| phone | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> alter table test4 change phone phone_number int(11) not null;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc test4;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(5) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| sex | varchar(5) | YES | | NULL | |
| phone_number | int(11) | NO | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
修改字段(非重命名)(数据类型,大小)
alter table 表名 modify 字段名 修改数据类型(大小);
mysql> desc test4;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(5) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| sex | varchar(5) | YES | | NULL | |
| phone_number | int(11) | NO | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> alter table test4 modify sex varchar(6) not null;
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc test4;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(5) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| sex | varchar(6) | NO | | NULL | |
| phone_number | int(11) | NO | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
删除字段
alter table 表名 drop 列名;
mysql> desc test4;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(5) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| sex | varchar(6) | NO | | NULL | |
| phone_number | int(11) | NO | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
mysql> alter table test4 drop sex;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> desc test4;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(5) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| phone_number | int(11) | NO | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
删除表
drop table 表名;
注意:
- 数据和结构都被删除
- 所有正在运行的相关事物被提交
- 所有相关索引被删除
- DROP TABLE 语句不能回滚
mysql> desc test4;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| id | int(5) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | NO | | NULL | |
| phone_number | int(11) | NO | | NULL | |
+--------------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
mysql> drop table test4;
Query OK, 0 rows affected (0.02 sec)
mysql> desc test4;
ERROR 1146 (42S02): Table 'lianxi.test4' doesn't exist
查看表的创建语句show create table 表名;
mysql> show create table test3;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test3 | CREATE TABLE `test3` (
`id` int(5) NOT NULL,
`name` varchar(20) DEFAULT NULL,
`phone` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
UNIQUE KEY `phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)